以下查询需要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;
答案 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;
}
索引。