5

我有两个要相交的表。第一个表格代表大约 5000 万个点,第二个表格是世界上所有国家的多边形图层。我想获得与该多边形相交的所有点。

SELECT d.id, d.geom 
FROM export d, world_boundaries b 
WHERE (b.cntry_name = 'UK') 
  AND d.date_inserted >= '2012-06-01' 
  AND d.geom && b.wkb_geometry 
  AND intersects(d.geom, b.wkb_geometry);

此查询非常简单,但运行时间超过 4 小时。我在每个表的几何列上构建了 GIST 索引,并且对它们都进行了 VACUUM ANALYZE。仍然没有性能提升。我正在使用 Postgres 8.4 和 PostGIS 1.5 运行 CENTOS 6。任何人都可以阐明如何加快速度吗?将查询限制为 1000 到 10000 条记录时,我很快就能得到结果。当我尝试获取完整的结果集时,它会拖动。想法?

更新:我现在看到我必须改进我的查询作为这个过程的第一步。我收到这样的信封

select astext(st_envelope(wkb_geometry)) as e 
from world_borders 
where cntry_name = 'UK'

现在,将其作为整个查询的一部分包含/执行的最有效方法是什么?

4

1 回答 1

1

尝试使用 EXPLAIN(和 LIMIT)运行它,以查看是否正在使用索引。

由于真正的交叉点检查是那里最慢的操作,因此可能针对子查询的ST_Collect运行它(除了 ST_Intersects 检查之外的所有内容)会有所帮助。这样就只有一个调用,如果多几何构造足够快,最终结果可能会更好。

编辑1:好吧,事实证明它不是那么理想,因为除非您将坐标强制为 3d(也保存 id),否则需要额外查找来获取几何 id:

SELECT d.id, d.geom
FROM
(
    SELECT *
    FROM
    ( 
        SELECT ST_Collect(d.geom)
        FROM export d, world_boundaries b 
        WHERE (b.cntry_name = 'UK') 
        AND d.date_inserted >= '2012-06-01' 
        AND d.geom && b.wkb_geometry
    ) as c, world_boundaries b 
    WHERE (b.cntry_name = 'UK')
    AND ST_Intersection(c.geom, b.wkb_geometry);
) as e, export d
WHERE (ST_Dump(e.geom)).geom = d.geom
于 2012-07-01T21:58:19.410 回答