В моем SQL-выражении я дважды вызываю сумму для одного и того же аргумента, дублирует ли это усилие? - PullRequest
11 голосов
/ 12 февраля 2010

рассмотрим мой 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 Ответ

15 голосов
/ 12 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...