SQL Server GROUP BY 太慢

问题描述 投票:0回答:2

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

我考虑过对视图建立索引,但我有一个文本列阻止了此选项。

sql sql-server performance group-by localdb
2个回答
0
投票

既然不能在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,您希望将它们分组在一起,因此实际名称将是分组的正确基础。


0
投票

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

  1. 尝试在视图基表中对Company、Department创建复合非聚集索引,为GROUP BY提供良好的性能。
  2. 由于您无法在视图上创建索引,请尝试再创建一个具有以下列的视图:Company、Department、company_id、action_id、report_Date,并且已应用 GROUP BY,您应该可以为此视图建立索引,因为它是直接的视图。只需查询应用了过滤器的视图即可。
© www.soinside.com 2019 - 2024. All rights reserved.