POSTGIS 优化查询

问题描述 投票:0回答:2

我有一个表,其中包含一个多多边形的“multip”类型的 GEOMETRY 列。 每个多边形包含多个多边形。 我的表很大(1200 万条记录)。

我需要对我的表进行快速查询,以提取我表中所有具有多边形的行,这些多边形位于地图可见框架(latmin、latmax、lngmin、lngmax)中。

我目前在以下查询中使用 ST_Dwithin 运算符:

SELECT id, mydata FROM mytable WHERE ST_Dwithin(multip, ST_TRANSFORM(ST_MakeEnvelope(" + myframe.join(',') + ", 4326), 2154),0) LIMIT 100

但是这个请求太慢了

有没有办法使用简化版的多边形来加快查询速度?例如,通过构建一个带有多边形质心的新列来代替?

感谢您的建议!

postgis centroid
2个回答
0
投票

看起来你的桌子上需要一个空间索引

试试这个

CREATE INDEX multip ON my table USING GIST (geom);

它可能有效,也可能无效,但值得一试。


0
投票

ST_DWithin
是一把瑞士军刀,甚至可以模拟
ST_Intersects
的功能 - 但它对性能的主要依赖是所考虑的几何图形的顶点数的乘积。

空间索引效率通常被任意大和分布广泛的多部分几何体打败——事实上,不仅建议将多部分几何体转储到它们的组件中并对其进行索引,而且对

ST_SubDivide
面几何体也是良好的实践甚至进一步减少每个组件的顶点数!


话虽这么说,你仍然很幸运:因为你想要的只是你的几何图形和视口矩形之间的边界框重叠,只需使用适当的索引驱动的

&&
运算符代替:

SELECT
  *
FROM
  mytable
WHERE
  multip && ST_Transform(ST_MakeEnvelope(" + myframe.join(',') + ", 4326), 2154)
LIMIT
  100
;
© www.soinside.com 2019 - 2024. All rights reserved.