ST_Intersects() 查询时间过长

ST_Intersects() query took too long

我正在使用实现 'spatial join' 工作的 PostGIS 扩展进行查询。 运行 查询花费了非常长的时间,最终失败了。查询如下:

CREATE INDEX buffer_table_geom_idx ON buffer_table USING GIST (geom);
CREATE INDEX point_table_geom_idx ON point_table USING GIST (geom);

SELECT
    point_table.*,
    buffer_table.something
FROM
    point_table
    LEFT JOIN buffer_table ON ST_Intersects (buffer_table.geom, point_table.geom);

其中point_table代表一个table包含超过1000万行的点记录; buffer_table 代表 table 只包含一个多边形几何体。

我想知道我的代码有没有问题以及调整的方法。提前致谢。

对于 LEFT JOIN,您将遍历 point_table 的每条记录,因此忽略了索引。试试这个,看看有什么不同:

SELECT point_table.*
FROM point_table
JOIN buffer_table ON ST_Contains(buffer_table.geom, point_table.geom);

分而治之ST_SubDivide

考虑到你的多边形的大小(见评论),将它分成更小的部分可能会很有趣,这样每个 containment/intersection 计算的顶点数量也会减少,从而减少查询贵。

先把大几何体分成小块存入另一个table(也可以用一个CTE/Subquery)

CREATE TABLE buffer_table_divided AS
SELECT ST_SubDivide(geom) AS geom FROM buffer_table

CREATE INDEX buffer_table_geom_divided_idx ON buffer_table_divided USING GIST (geom);

.. 并针对这个新 table:

再次执行您的查询
SELECT point_table.*
FROM point_table
JOIN buffer_table_divided d ON ST_Contains (d.geom, point_table.geom);

演示:db<>fiddle