使用PostGIS加速PostgreSQL查询(ST_intercept)

时间:2014-09-21 10:16:48

标签: sql database performance postgresql postgis

我需要一些帮助:

我警告你,我的英语不是很好。

我想减少查询的执行时间。

我将解释背景,然后你把我所做的SQL查询。

我有一组代表同步时间的点是在一个坐标附近行驶15分钟。然后我必须通过SQL查询找到与这组点对应的区域。

我可以完成这项工作,但SQL查询的执行时间有点长:4k点,邻域20k(多边形):15秒

我想优化执行时间,你能帮助我吗?提前感谢您的回复,对不起拼写和使用的英语(谷歌翻译)。以下是我使用的SQL查询:

1)用点的geocollection创建我的等时线表,我用ST_buffer和ST_union将这个几何变换到一个大的区域,我用ST_Simplify简化区域,并使用ST_SetSRID制作一个栅格。(... .. = 4k点)

   CREATE TABLE tab1 AS select ST_SetSRID(st_simplify(ST_Union(ST_Buffer(ST_GeomFromText('GEOMETRYCOLLECTION(POINT(3.7 50.995),POINT(3.7 50.9975),POINT(3.7 50.985),POINT(3.7 50.9875),......)'),0.00180)),0.0025),4326) as geom;

2)添加主键gid

   ALTER table tab1 ADD Column gid serial PRIMARY KEY;

3)创建索引

   CREATE INDEX idx_tab1_geom on tab1 USING gist(geom);

4)最后进行此查询,其中data_ins是一个表示邻域的多字形表。

   select DISTINCT ON (data_ins.gid ) data_ins.* from data_ins, tab1 where  data_ins.geom && tab1.geom and st_intersects(data_ins.geom,tab1.geom) ;

我用&&和st_intersects因为它的速度更快,只有st_intersects。

Data_ins也被编入索引。

我在个人电脑上工作(Windows 8 64位,6GO,PostgreSQL 9.3.5 64位)

Postgresql.conf修改:shared_buffers = 512MB,effective_cache_size = 928MB,random_page_cost = 2.0。我无法改变更改work_mem,因为如果我这样做,postgreSQL服务器无法启动。

解析(分析,缓冲)1)(400分):http://explain.depesz.com/s/IXJ

4)(大几何与20.000多边形)的EXPLAIN(ANALYZE,BUFFERS):http://explain.depesz.com/s/ygnj

感谢您的回复。

大卫。

0 个答案:

没有答案