在我的sql语句中,我为同一个参数调用了两次sum,是否重复了这些努力?

时间:2010-02-12 17:32:23

标签: sql sql-server

考虑下面的sql查询;它为同一个参数调用两次。这是重复服务器完成的工作。有更好的方法吗?

SELECT      Status_Detail_Code, count(*) as 
   [Number of times assigned], round(sum(Duration)/60,2) as [total duration Hr]

 FROM         dbo.V_TIMELINE

 WHERE     (CADATE > N'20080101')  

group by Status_Detail_Code order by sum(Duration) desc

1 个答案:

答案 0 :(得分:15)

不,SQL Server重复使用聚合。

实际上,如果您构建查询计划,您将在聚合运算符(如SUM)的结果集中看到Stream Aggregate,表示为Expr****

此表达式的值稍后将用作其他运算符的输入。

以下是示例查询:

SELECT  ROUND(SUM(id), -1)
FROM    master
GROUP BY
        name
ORDER BY
        SUM(id) DESC

它的计划是:

  |--Compute Scalar(DEFINE:([Expr1004]=round([Expr1003],(-1))))
       |--Sort(ORDER BY:([Expr1003] DESC))
            |--Stream Aggregate(GROUP BY:([test].[dbo].[master].[name]) DEFINE:([Expr1003]=SUM([test].[dbo].[master].[id])))
                 |--Index Scan(OBJECT:([test].[dbo].[master].[ix_name_desc]), ORDERED BACKWARD)

如您所见,聚合只进行一次并存储在Expr1003

Expr1003然后在Sort运算符(处理ORDER BY)和Compute Scalar(处理ROUND

中重复使用