我在优化一些 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);
任何想法如何加快此查询以及为什么不使用索引?
这对我来说很新,如果我写的东西没有意义,请忽略它:)