SQL Server 聚合性能

标签 sql sql-server performance math aggregate

我想知道如果您在查询中喜欢聚合,如果再次使用它们,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 万行
  • Expr1011 = 总和
  • Expr1003 = some internal thing to do with "no rows" etc但基本上是 Expr1011
  • Expr1004 = Expr1011/12
  • 关于SQL Server 聚合性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6507883/

    相关文章:

    java - JPA 标准在所选日期上添加一天

    java - 收到错误 SQLServerException : The result set is closed

    sql - 为什么 SQL Server 不支持无符号数据类型?

    sql - 创建表 : "There is already an object named ' table' in the database", 时出错,但我对该名称没有任何限制

    MySQL InnoDB 优化

    javascript - RTCPeerConnection 的高 CPU 使用率

    javascript - 使用 SQLite 获取距今天最近的 5 个日期

    SQL - 右连接或子查询中存在的位置/位置

    sql - 选择总和和内连接

    R根据条件(相同ID)替换值而不使用for循环