Нет, 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
)