哪种SQL更昂贵,为什么?

哪种SQL更昂贵,为什么?,sql,sql-server,database,Sql,Sql Server,Database,上述两个查询产生相同的结果。 在我看来,第二个查询的成本更高,因为它使用的GROUPBY函数的成本更高。 如果ans是正确的还是其他原因,这是正确的解释吗?与任何有关性能的问题一样,最好在系统上测试对数据的查询。索引和表大小等因素可以决定哪个更快。如果你对这样的问题感兴趣,你需要知道如何阅读它们 这就是说,我预计第一行的费用会更高,因为总工资可能首先计算,然后与每一行对齐。然后删除重复项 但是优化器可以自由地做它想做的事情,包括为两个查询生成完全相同的执行计划。与任何有关性能的问题一样,最好在系

上述两个查询产生相同的结果。 在我看来,第二个查询的成本更高,因为它使用的GROUPBY函数的成本更高。
如果ans是正确的还是其他原因,这是正确的解释吗?

与任何有关性能的问题一样,最好在系统上测试对数据的查询。索引和表大小等因素可以决定哪个更快。如果你对这样的问题感兴趣,你需要知道如何阅读它们

这就是说,我预计第一行的费用会更高,因为总工资可能首先计算,然后与每一行对齐。然后删除重复项


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

与任何有关性能的问题一样,最好在系统上对数据进行查询测试。索引和表大小等因素可以决定哪个更快。如果你对这样的问题感兴趣,你需要知道如何阅读它们

这就是说,我预计第一行的费用会更高,因为总工资可能首先计算,然后与每一行对齐。然后删除重复项


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

您如何得出结论认为
group by
函数的成本更高

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

我的初步发现(没有任何数据)表明,对于SQL引擎而言,
groupby
版本的强度较低


您是如何得出结论认为
group by
功能的成本更高的

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

我的初步发现(没有任何数据)表明,对于SQL引擎而言,
groupby
版本的强度较低


检查计划并测量两个查询的CPU和逻辑IO成本。乙二醇

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

Select Dept, SUM(Salary) FROM Table GROUP BY Dept
第二个查询的计划更复杂,成本更高:

按查询分组

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.

检查计划并测量两个查询的CPU和逻辑IO成本。乙二醇

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

Select Dept, SUM(Salary) FROM Table GROUP BY Dept
第二个查询的计划更复杂,成本更高:

按查询分组

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.

@GordonLinoff你是对的。你可以运行它们并查看计划:)@GordonLinoff你是对的。你可以运行它们并查看计划:)