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
我正在使用实现 '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