[英]Postgresql query optimization Index not used
我在優化某些posgresql查詢時遇到了一些麻煩。 例如,這個接縫是最慢的:
select st_astext(geom), 'all' as type
from (
select ST_Simplify(ST_Intersection(ST_MakePolygon(ST_GeomFromText(? ,4326)), st_transform(way, 4326)), ?) as geom
from planet_osm_polygon
where (sT_Intersects(ST_MakePolygon(ST_GeomFromText(?,4326)), st_transform(way,4326))=true)
and ('natural' IN ('water', 'pond') OR waterway IN ('basin', 'canal', 'mill_pond', 'pond', 'riverbank', 'stream'))
) AS subquery";
我要做的第一件事是編輯conf文件和更改緩沖區大小,總花費的時間減少了百分之幾。
我要做的下一件事是從現有表中創建新表,並將多面多邊形分解為多邊形。 這使大多數查詢從70-90%加快了速度。 但是,最慢的3個查詢的速度沒有超過百分之幾。
通過使用EXPLAIN和ANALYZE檢查搜索,我意識到未使用索引。 即使我禁用它,也使用seqscan。 據我所知,這意味着我應該做一個新索引。
在表planet_osm_polygon中,我有兩個索引:
CREATE INDEX planet_osm_polygon_index_poly
ON planet_osm_polygon_poly
USING gist (way);
CREATE INDEX planet_osm_polygon_poly_pkey
ON planet_osm_polygon_poly
USING btree (osm_id);
有什么想法可以加快查詢速度,為什么不使用索引?
這對我來說是很新的,如果我寫的東西沒有意義,那就忽略它吧:)
索引可能與WHERE部分中的ST_Intersects一起使用,除非不是因為在數據上使用了一個函數,即st_transform(way,4326)
,否則它們沒有st_transform(way,4326)
。 您的選擇是避免使用該函數(在本機投影中執行交叉查詢,這將產生不同的答案),或者使用該函數添加索引(盡管我不是100%確信這可以與ST_Intersects一起使用)。
最后,有兩點。 SELECT 'natural' IN ('water', 'pond');
永遠是錯誤的。 並且SELECT true=true
為true,因此任何布爾運算符(如ST_Intersects(g1, g2)=true
在邏輯上都是有效的,但在美學上是多余的。 只需使用ST_Intersects(g1, g2)
而不使用“等於true”部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.