sql-server SQL Server GROUP BY太慢

f2uvfpb9  于 2022-10-31  发布在  SQL Server
关注(0)|答案(2)|浏览(357)

我尝试在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和字段名称之间的链接。
我想索引视图,但我有一个文本列,这阻止了这个选项。

ua4mk5z4

ua4mk5z41#

因为不能在VIEW上创建索引,所以我希望底层表具有索引来优化查询,例如(company_id,action_id,report_date)的复合索引。
也就是说,您的group by条件是基于公司名称而不是ID显示的。如果group by是基于company_ID而不是company,这可能会有所帮助--如果公司名称与其对应的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具有相同的公司名称,您希望将其分组在一起,因此实际名称将是分组的正确基础。

a14dhokn

a14dhokn2#

我建议您采用以下方法来解决性能问题:
1.尝试在视图基表中的Company,Department上创建一个复合非聚集索引,以便为GROUP BY给予良好的性能。
1.由于您无法在视图上创建索引,请尝试再创建一个具有以下列的视图:Company,Department,company_id,action_id,report_Date,已经应用了GROUP BY,您应该可以对此视图编制索引,因为它是一个简单的视图。只需查询应用了筛选器的视图即可。

相关问题