使用ST_Intersects()查询性能问题

时间:2016-01-28 06:23:11

标签: 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_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;

1 个答案:

答案 0 :(得分: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);

所以你带着Bagalkot区的村庄加入到网格点。第三个表格为LEFT JOIN,意味着ref_globalid的值为NULL,其中没有对应的值等于b.globalid。然后,您可以count() b.globalid totalsamples c.ref_globalid NULL gist {@ 1}} {@ 1}}不计算geometry值。

这将是原始速度的两倍。关于索引的使用,如果没有关于表的详细信息,则无法说明,但通常您应该在 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ static NSString *cellIdentifier = @"Cell"; UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; _cellbackground=[[UIView alloc]initWithFrame:CGRectMake(0, 0, 310, 0)]; _cellbackground.backgroundColor=[UIColor whiteColor]; [cell addSubview:_cellbackground]; return cell; } 列上添加-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ return _cellbackground.frame.size.height+10; } 索引。