Совокупная производительность SQL Server

Мне интересно, знает ли SQL Server кешировать, если вы хотите, чтобы агрегаты находились в запросе, если они снова используются.

Например,

Select Sum(Field),
       Sum(Field) / 12
From   Table

Знает ли SQL Server, что он уже вычислил функцию Sum в первом поле, а затем просто разделил ее на 12 для второго? Или он снова запустит функцию Sum, а затем разделит ее на 12?

Спасибо

Ответ 1

Он вычисляет один раз

Select
   Sum(Price),
   Sum(Price) / 12
From
   MyTable

План дает:

|--Compute Scalar(DEFINE:([Expr1004]=[Expr1003]/(12.)))
  |--Compute Scalar(DEFINE:([Expr1003]=CASE WHEN [Expr1010]=(0) THEN NULL ELSE [Expr1011] END))
     |--Stream Aggregate(DEFINE:([Expr1010]=Count(*), [Expr1011]=SUM([myDB].[dbo].[MyTable].[Price])))
        |--Index Scan(OBJECT:([myDB].[dbo].[MyTable].[IX_SomeThing]))

В этой таблице содержится 1,35 миллиона строк

Ответ 2

В соответствии с планом выполнения он не переучет столбца.

Ответ 3

Хороший вопрос, я думаю, что ответ отрицательный, он не кэширует его.

Я запустил тестовый запрос с около 3000 отсчетов в нем, и он был намного медленнее, чем у одного лишь с несколькими. Все еще хотите проверить, будет ли запрос столь же медленным, выбрав только простые столбцы.

edit: ОК, я просто попытался выбрать большое количество столбцов или только один, а количество столбцов (когда речь идет о тысячах возвращаемых) действительно влияет на скорость.

В целом, если вы не используете этот суммарный номер в несколько раз в своем запросе, вы должны быть в порядке. Push нажимает, вы всегда можете сохранить результат в переменной и выполнить математику после этого.