【问题标题】:Postgresql query optimization Index not usedPostgresql 查询优化索引未使用
【发布时间】:2014-05-15 09:11:15
【问题描述】:

我在优化一些 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);

任何想法如何加快此查询以及为什么不使用索引?

这对我来说很新,如果我写的东西没有意义,请忽略它:)

【问题讨论】:

  • 我对 PostgreSQL 不是很熟悉,但我想那些 ST_* 都是自定义函数,对吧?我不希望任何 RDBMS 能够优化对自定义函数结果的访问。由于您的 where 子句中确实有一个 AND,您可以尝试切换这两个条件,看看性能是否变得更好。
  • 请将explain analyze的输出贴出来(格式在这里,或者上传到depesz.com
  • 另一个问题... 'natural' IN ('water','pond') 假设是什么意思?自然是列还是常数?在前一种情况下,为什么要引用它?在后一种情况下,显然这个条件总是错误的。
  • 请阅读stackoverflow.com/tags/postgresql-performance/info 并根据那里给出的建议更新问题。
  • 子查询中的“全部”指的是什么?令我震惊的是,正如所写的那样,子查询并不是真正必要的。

标签: sql postgresql query-optimization postgis postgresql-performance


【解决方案1】:

索引可能会与 WHERE 部分中的 ST_Intersects 一起使用,除非它们不是因为在数据上使用了函数,即st_transform(way,4326)。您的选择是避免使用该函数(在本机投影中执行 interesction 查询,这将产生不同的答案),或者使用该函数添加索引(尽管我不能 100% 确定这将与 ST_Intersects 一起使用)。

最后,两点。 SELECT 'natural' IN ('water', 'pond'); 总是错误的。而SELECT true=true 是真的,所以任何像ST_Intersects(g1, g2)=true 这样的布尔运算符在逻辑上都是有效的,但在美学上是多余的。只需使用 ST_Intersects(g1, g2) 而不使用“等于真”部分。

【讨论】:

  • 您也可以尝试在运行查询之前转换几何图形并显式设置表的几何图形,查看 UpdateGeometrySRID 函数:postgis.org/docs/UpdateGeometrySRID.html。正如 Mike 所说,ST_Transform 将使优化器更难找到空间索引。
猜你喜欢
  • 1970-01-01
  • 2014-08-19
  • 2013-04-11
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
相关资源
最近更新 更多