如何在 Postgis 上更快地进行选择查询

Posted

技术标签:

【中文标题】如何在 Postgis 上更快地进行选择查询【英文标题】:how to make select query faster on Postgis 【发布时间】:2020-04-06 10:37:04 【问题描述】:

此查询在圆圈内选择几何_id

 select tbl2.geometry_id from geometryTable tbl1
        join geometryTable tbl2 on  ST_Intersects(ST_Buffer(ST_centroid(tbl1.geometry)::geography, 1000)::geometry, tbl2.geometry)
    where tbl1.geometry_id = '112233'

此查询运行良好,但耗时过多,超过 20 秒。我需要使这个查询更快。

【问题讨论】:

请发布EXPLAIN (ANALYZE, BUFFERS) <your query>;的输出 【参考方案1】:

若要获取位于tbl1 几何中心的1000 米内的tbl2 几何,您可以省略缓冲区创建并使用ST_DWithin 直接依赖距离

select tbl2.geometry_id 
from geometryTable tbl1
   join geometryTable tbl2 
    on ST_DWithin(ST_centroid(tbl1.geometry)::geography, tbl2.geometry::geography,1000, true)
where tbl1.geometry_id = '112233';

如果这还不够,您可以在质心地理上创建空间索引

CREATE tl1_centroid_geog ON tbl1 USING GIST(geography(ST_centroid(geometry)));

最终在 tbl2 地理上也是如此

CREATE tl2_geog ON tbl2 USING GIST(geography(geometry));

【讨论】:

【参考方案2】:

如果数据很大,您可以添加索引。 请阅读 -tutorialspoint 大致相同。 希望对你有帮助

【讨论】:

以上是关于如何在 Postgis 上更快地进行选择查询的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 应用中更快地搜索本地数据?

如何优化我的查询以更快地获得结果?

如何通过java程序更快地选择和插入百万条记录

SQL SERVER,使用(TABLOCKX)选择查询会比使用(NOLOCK)更快,反之亦然?

如何在没有昂贵查询的情况下更快地自连接表(Oracle SQL)

如何优化限制查询以便从庞大的表中更快地访问数据?