哪种SQL比较昂贵,为什么?

时间:2020-07-18 16:52:03

标签: sql sql-server database

Select DISTINCT Dept,SUM(Salary) OVER (PARTITION BY Dept) from Table

Select Dept, SUM(Salary) FROM Table GROUP BY Dept

以上两个查询都产生相同的结果。 我认为第二个查询比较昂贵,因为它使用的是GROUP BY函数,因此比较昂贵。 如果ans是正确的,是正确的解释还是其他?

3 个答案:

答案 0 :(得分:2)

与任何有关性能的问题一样,最好对系统上的数据测试查询。诸如索引和表大小之类的因素可以确定哪个更快。如果您对这样的问题感兴趣,则需要learn about execution plans以及如何阅读它们。

也就是说,我希望第一个会更贵,因为合计工资可能会首先计算出来,然后与每一行保持一致。然后删除重复项。

但是优化器可以自由地做自己想做的事情,包括为两个查询生成完全相同的执行计划。

答案 1 :(得分:0)

您如何得出group by函数较昂贵的结论?

如果您使用的是Microsoft SQL Server Management Studio,则可以让应用程序告诉您哪个版本更昂贵。请参见下面的屏幕快照中的准则。

我的初步发现(没有任何数据)表明,group by版本对SQL引擎的要求不高。

SSMS guidelines

答案 2 :(得分:0)

检查计划并衡量两个查询的CPU和逻辑IO成本。 EG

use AdventureWorks2017
go
set statistics time on 
set statistics IO on 
go

select JobTitle, sum(SickLeaveHours) SickLeaveHours
from HumanResources.Employee 
group by JobTitle


select distinct JobTitle, sum(SickLeaveHours) over (partition by JobTitle) SickLeaveHours
from HumanResources.Employee

go
set statistics time off
set statistics IO off

第二个查询的计划更加复杂,成本更高:

按查询分组

Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'Employee'. Scan count 1, logical reads 9, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.

DISTINCT查询

 Table 'Worktable'. Scan count 3, logical reads 849, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
 Table 'Employee'. Scan count 1, logical reads 9, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
相关问题