Postgresql ST_Intersects()的查询性能问题
执行以下查询需要3.06分钟。如何加速此查询?如何在执行查询时使用现有索引列Postgresql ST_Intersects()的查询性能问题,postgresql,postgis,postgresql-performance,Postgresql,Postgis,Postgresql Performance,执行以下查询需要3.06分钟。如何加速此查询?如何在执行查询时使用现有索引列 SELECT samples_collected.talukname,sample_count,TotalSamples from ( SELECT a.talukname talukname, COUNT (DISTINCT b.globalid) sample_count FROM village a, gridpoint_1 b ,gridpoint_1__attach c WHERE st_intersec
SELECT samples_collected.talukname,sample_count,TotalSamples from
(
SELECT a.talukname talukname, COUNT (DISTINCT b.globalid) sample_count
FROM village a, gridpoint_1 b ,gridpoint_1__attach c
WHERE st_intersects(a.shape,b.shape)
and b.globalid=c.rel_globalid
and a.districtname='Bagalkot'
GROUP BY a.talukname
) samples_collected,
(
SELECT a.talukname talukname,COUNT (DISTINCT b.globalid) TotalSamples
FROM village a
INNER JOIN
gridpoint_1 b ON st_intersects(a.shape,b.shape)
WHERE a.districtname='Bagalkot'
GROUP BY a.talukname
) total
WHERE samples_collected.talukname=total.talukname;
您要做两次艰苦的工作,这显然是低效的:
ST_在两个子查询中相交(a.shape,b.shape)
。与其使用两个子查询,不如将它们放在一起,然后在分区上执行不同的count()
s:
SELECT DISTINCT a.talukname,
count(DISTINCT b.globalid) OVER w AS totalsamples,
count(DISTINCT c.rel_globalid) OVER w AS sample_count,
FROM village a
JOIN gridpoint_1 b ON ST_Intersects(a.shape, b.shape)
LEFT JOIN gridpoint_1__attach c ON c.rel_globalid = b.globalid
WHERE a.districtname = 'Bagalkot'
WINDOW w AS (PARTITION BY a.talukname);
所以你把Bagalkot区的村庄连接到网格点。第三个表是LEFT JOIN
ed,这意味着ref\u globalid
的值是NULL
,其中没有对应的值等于b.globalid
。然后,您可以在b.globalid
上对totalsamples
执行count()
,在c.ref\u globalid
上对sample\u count执行(NULL
不计算值)
这将是原来速度的两倍。关于索引的使用,没有关于您的表的详细信息,什么都不能说,但一般来说,您应该在几何体列上放置要点索引。运行解释分析(您的\u选择\u查询)
并使用它来分析结果