我有一个表,其中包含一个多多边形的“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
但是这个请求太慢了
有没有办法使用简化版的多边形来加快查询速度?例如,通过构建一个带有多边形质心的新列来代替?
感谢您的建议!
ST_DWithin
是一把瑞士军刀,甚至可以模拟 ST_Intersects
的功能 - 但它对性能的主要依赖是所考虑的几何图形的顶点数的乘积。
空间索引效率通常被任意大和分布广泛的多部分几何体打败——事实上,不仅建议将多部分几何体转储到它们的组件中并对其进行索引,而且对
ST_SubDivide
面几何体也是良好的实践甚至进一步减少每个组件的顶点数!
话虽这么说,你仍然很幸运:因为你想要的只是你的几何图形和视口矩形之间的边界框重叠,只需使用适当的索引驱动的
&&
运算符代替:
SELECT
*
FROM
mytable
WHERE
multip && ST_Transform(ST_MakeEnvelope(" + myframe.join(',') + ", 4326), 2154)
LIMIT
100
;