我正在尝试在 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 和名称之间的链接。
我考虑过对视图建立索引,但我有一个文本列阻止了此选项。
既然不能在VIEW上创建索引,我希望底层表有索引来优化查询,比如(company_id,action_id,report_date)的复合索引。
也就是说,您的分组条件是根据公司名称而不是 ID 出现的。如果分组依据是基于 company_ID 而不是公司,这可能会有所帮助 - 如果公司名称与其相应的 ID 完全不同,例如
id company Dept
1 Comp A Dept X
2 Comp B Dept Y
3 Comp C Dept X
对
id company Dept
1 Comp A Dept X
2 Comp A Dept Y
3 Comp A Dept Z
在第二种情况下,ID 组将不起作用,因为可能有许多具有相同公司名称的 ID,您希望将它们分组在一起,因此实际名称将是分组的正确基础。
我建议您采用以下方法来解决性能问题: