Общая производительность SQL Server - PullRequest
11 голосов
/ 28 июня 2011

Мне интересно, знает ли SQL Server «кэшировать», если вам нравятся агрегаты во время запроса, если они используются снова.

Например,

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

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

Спасибо

Ответы [ 3 ]

8 голосов
/ 28 июня 2011

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

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 миллиона строк

3 голосов
/ 28 июня 2011

Согласно плану выполнения, столбец не суммируется.

0 голосов
/ 28 июня 2011

хороший вопрос, я думаю, что ответ - нет, он не кеширует его.

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

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

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

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