我试图在SQL LocalDB上运行两个查询。其中一个执行速度很快,另一个执行12秒,尽管差异只是一个列添加到select和group by子句中。
以下查询几乎立即执行:
select [Company]
,sum([Hours]) as [Hours]
from [Operation View]
where company_id in (19,53,76,1)
and action_id in (5,21,23,30)
and [Report Date] >= '2014-04-01'
group by [Company]
order by Company
虽然以下查询大约需要12秒:
select [Company]
,Department
,sum([Hours]) as [Hours]
from [Operation View]
where company_id in (19,53,76,1)
and action_id in (5,21,23,30)
and [Report Date] >= '2014-04-01'
group by [Company]
,Department
如您所见,我只在select和group by子句中添加了一个额外的列Department
。
如果我尝试添加更多列,则执行时间将保持为12秒。
这是正常行为吗?有什么办法可以加快查询速度吗?
请注意,[操作视图]是一个视图,它基于由其他查找表连接的主表,提供ID和字段名称之间的链接。
我考虑过对视图编制索引,但是我有一个文本列阻止了这个选项。
答案 0 :(得分:0)
由于您无法在VIEW上创建索引,我希望基础表具有优化查询的索引,例如(company_id,action_id,report_date)的复合索引。
也就是说,按条件显示的组是基于公司名称而不是ID。如果group by基于company_ID而不是公司,它可能会有帮助 - 如果公司名称与其相应的ID完全不同,例如
id company Dept
1 Comp A Dept X
2 Comp B Dept Y
3 Comp C Dept X
VS
id company Dept
1 Comp A Dept X
2 Comp A Dept Y
3 Comp A Dept Z
在第二种情况下,ID组不起作用,因为可能有许多具有相同公司名称的ID,因此实际名称将成为分组的正确基础。
答案 1 :(得分:0)
我建议您采用以下解决性能问题的方法: