我正在练习T-SQL,不知道在以下查询中将计算SUM()多少次:
SELECT
DepositGroup,
SUM(DepositAmount) AS TotalSum
FROM WizzardDeposits
WHERE MagicWandCreator = 'Ollivander family'
GROUP BY DepositGroup
HAVING SUM(DepositAmount) < 150000
ORDER BY SUM(DepositAmount) DESC
每次我写SUM(DepositAmount)
时都会计算出来吗?还是只计算一次就可以返回结果呢?我担心如果每次调用它都需要计算多少资源。预先谢谢你!
答案 0 :(得分:0)
它将被计算一次。
可以计算SUM
的唯一位置是聚合运算符(流聚合或哈希聚合)内部。
如果查看执行计划,则只会看到一个聚合运算符。它将在下面的行中具有定义的values属性。
[ExprxxxX] = Scalar Operator(COUNT_BIG([YourDB].[dbo].[WizzardDeposits].[DepositAmount]))
[ExprxxxY] = Scalar Operator(SUM([YourDB].[dbo].[WizzardDeposits].[DepositAmount]))
然后,聚合运算符的左侧将有一个计算标量运算符,其表达式为
[ExprxxxZ] = Scalar Operator(CASE WHEN [ExprxxxX]=(0) THEN NULL ELSE [ExprxxxY] END)
如果SUM
为零,则确保NULL
返回COUNT_BIG
(not possible in this case,因为GROUP BY
不可能为组发出一行没有行)。
过滤器(实现HAVING
)和排序(用于ORDER BY
)将引用此[ExprxxxZ]
。
存在no guarantee的下CASE
表达式是否仅被计算一次并每次传递或重新求值,但是无论如何这都是微不足道的。大部分工作由聚合运算符完成,并且每个组当然只能完成一次。