开发者

SQL Server aggregate performance

开发者 https://www.devze.com 2023-03-15 18:44 出处:网络
I am wondering whether SQL Server knows to \'cache\' if you like aggregates while in a query, if they are used again.

I am wondering whether SQL Server knows to 'cache' if you like aggregates while in a query, if they are used again.

For example,

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

Would SQL Server know that it has already calculated the Sum function on the first field and then just divide it by 12 for the second? Or would it 开发者_如何学编程run the Sum function again then divide it by 12?

Thanks


It calculates once

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

The plan gives:

|--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]))

This table has 1.35 million rows

  • Expr1011 = SUM
  • Expr1003 = some internal thing to do with "no rows" etc but is Expr1011 basically
  • Expr1004 = Expr1011 / 12


According to the execution plan, it doesn't re-sum the column.


good question, i think the answer is no, it doesn't not cache it.

I ran a test query with around 3000 counts in it, and it was much slower than one with only a few. Still want to test if the query would be just as slow selecting just plain columns

edit: OK, i just tried selecting a large amount of columns or just one, and the amount of columns (when talking about thousands being returned) does effect the speed.

Overall, unless you are using that aggregate number a ton of times in your query, you should be fine. Push comes to shove, you could always save the outcome to a variable and do the math after the fact.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号