SQL Server聚合性能

11

我想知道SQL Server是否能够在查询时“缓存”聚合操作,如果这些操作被再次使用。

例如:

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

SQL Server会知道它已经在第一个字段上计算了Sum函数,然后只需将其除以12用于第二个字段吗?还是它会再次运行Sum函数,然后将其除以12?

谢谢

3个回答

9

它只计算一次

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万行


谢谢,我选择了这个方案。 - user110714

3
根据执行计划,它不会重新汇总该列。

-3

好问题,我认为答案是否定的,它不会缓存。

我运行了一个包含大约3000个计数的测试查询,比只有几个计数的查询要慢得多。仍然想测试一下,如果查询只选择普通列,速度是否会一样慢。

编辑:好的,我刚刚尝试选择大量列或只选择一个列,当返回数千个时,列的数量确实会影响速度。

总的来说,除非你在查询中使用那个聚合数字很多次,否则你应该没问题。如果必要,你可以将结果保存到变量中,在事后进行计算。


-1- 时间可能是渲染结果或从内存中提取3000个相同值的时间指示,并且不表示结果是否已缓存。 - JNK
好的,但是你回答的第一行仍然事实上和可证明是错误的,所以我会保留我的反对票。 - JNK
你认为这是一个事实陈述吗?我认为答案是否定的。 - Limey
1
无论你怎么说,"不" 都是这个问题的错误答案。 - JNK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接