SQL Server GROUP BY太慢了

时间:2014-05-20 13:58:15

标签: sql sql-server performance group-by localdb

我试图在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和字段名称之间的链接。

我考虑过对视图编制索引,但是我有一个文本列阻止了这个选项。

2 个答案:

答案 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)

我建议您采用以下解决性能问题的方法:

  1. 尝试在视图的基表中的Company,Department上创建一个复合的非聚集索引,以使GROUP BY表现良好。
  2. 由于您无法在视图上创建索引,请尝试再创建一个具有以下列的视图:公司,部门,company_id,action_id,report_Date,并且已应用GROUP BY,并且应该可以为您建立索引这种视图,因为它是直接视图。只需查询应用了过滤器的视图即可。