我尝试在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秒。
这是正常的行为吗?我可以做些什么来加快查询速度吗?
请注意,[Operation View]是一个基于主表的视图,该主表由其他查找表连接,这些查找表提供了字段ID和字段名称之间的链接。
我想索引视图,但我有一个文本列,这阻止了这个选项。
2条答案
按热度按时间ua4mk5z41#
因为不能在VIEW上创建索引,所以我希望底层表具有索引来优化查询,例如(company_id,action_id,report_date)的复合索引。
也就是说,您的group by条件是基于公司名称而不是ID显示的。如果group by是基于company_ID而不是company,这可能会有所帮助--如果公司名称与其对应的ID完全不同,例如
与
在第二种情况下,ID组将不起作用,因为可能会有许多ID具有相同的公司名称,您希望将其分组在一起,因此实际名称将是分组的正确基础。
a14dhokn2#
我建议您采用以下方法来解决性能问题:
1.尝试在视图基表中的Company,Department上创建一个复合非聚集索引,以便为GROUP BY给予良好的性能。
1.由于您无法在视图上创建索引,请尝试再创建一个具有以下列的视图:Company,Department,company_id,action_id,report_Date,已经应用了GROUP BY,您应该可以对此视图编制索引,因为它是一个简单的视图。只需查询应用了筛选器的视图即可。