我想知道SQL Server是否能够在查询时“缓存”聚合操作,如果这些操作被再次使用。
例如:
Select Sum(Field),
Sum(Field) / 12
From Table
SQL Server会知道它已经在第一个字段上计算了Sum函数,然后只需将其除以12用于第二个字段吗?还是它会再次运行Sum函数,然后将其除以12?
谢谢
我想知道SQL Server是否能够在查询时“缓存”聚合操作,如果这些操作被再次使用。
例如:
Select Sum(Field),
Sum(Field) / 12
From Table
SQL Server会知道它已经在第一个字段上计算了Sum函数,然后只需将其除以12用于第二个字段吗?还是它会再次运行Sum函数,然后将其除以12?
谢谢
它只计算一次
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]))
这个表格有135万行
好问题,我认为答案是否定的,它不会缓存。
我运行了一个包含大约3000个计数的测试查询,比只有几个计数的查询要慢得多。仍然想测试一下,如果查询只选择普通列,速度是否会一样慢。
编辑:好的,我刚刚尝试选择大量列或只选择一个列,当返回数千个时,列的数量确实会影响速度。
总的来说,除非你在查询中使用那个聚合数字很多次,否则你应该没问题。如果必要,你可以将结果保存到变量中,在事后进行计算。