考虑下面的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
没有, 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
)