Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql ST_Intersects()的查询性能问题_Postgresql_Postgis_Postgresql Performance - Fatal编程技术网

Postgresql ST_Intersects()的查询性能问题

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

执行以下查询需要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_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查询)
并使用它来分析结果