Совокупная производительность 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 нажимает, вы всегда можете сохранить результат в переменной и выполнить математику после этого.