SUM()将被计算多少次?

时间:2019-09-06 15:58:48

标签: sql-server database aggregate-functions

我正在练习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)时都会计算出来吗?还是只计算一次就可以返回结果呢?我担心如果每次调用它都需要计算多少资源。预先谢谢你!

1 个答案:

答案 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_BIGnot possible in this case,因为GROUP BY不可能为组发出一行没有行)。

过滤器(实现HAVING)和排序(用于ORDER BY)将引用此[ExprxxxZ]

存在no guarantee的下CASE表达式是否仅被计算一次并每次传递或重新求值,但是无论如何这都是微不足道的。大部分工作由聚合运算符完成,并且每个组当然只能完成一次。