aeu*_*ere 5 postgresql postgis
我有两张桌子,我想交叉.第一个表代表大约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);
Run Code Online (Sandbox Code Playgroud)
此查询非常简单,但运行时间超过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'
Run Code Online (Sandbox Code Playgroud)
现在,作为整个查询的一部分包含/执行此操作的最有效方法是什么?
尝试使用 EXPLAIN(和 LIMIT)运行它来查看索引是否正在被使用。
由于真正的交集检查是最慢的操作,因此可能针对子查询的ST_Collect(除了 ST_Intersects 检查之外的所有内容)运行它会有所帮助。这样就只有一次调用,如果多几何构造足够快,最终结果可能会更好。
edit1:嗯,事实证明它并不是那么理想,因为除非你强制坐标为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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2305 次 |
最近记录: |