2016-01-28 45 views
-1

以下查询需要3.06分钟才能执行。如何加快此查询?如何在执行查询时使用现有的索引列?使用ST_Intersects查询性能问题()

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; 
+0

运行'explain analyze(your_select_query)'并使用http://explain.depesz.com/分析结果 –

回答

1

您正在做两次这样的努力工作,这在两个子查询中显然是效率低下的:ST_Intersects(a.shape, b.shape)。而不是使用两个子查询,你应该把它们放在一起,然后做不同count()结束了分区:

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); 

所以你花村在区巴加尔科特和加入,为网格点。第三个表是LEFT JOIN ed,意思是ref_globalid的值是NULL,其中没有相应的值等于b.globalid。然后你可以在b.globalid上为totalsamplesc.ref_globalidcount() for sample_count(NULL值不计算在内)。

这将比原来快两倍。关于索引的使用没有关于表格的详细信息,但是通常您应该在geometry列中输入gist索引。