簡體   English   中英

PostgreSQL查詢優化索引未使用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM