您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

是否有用于SQL聚合函数计算的标准?

是否有用于SQL聚合函数计算的标准?

尽管我使用过许多不同的DBMS,但我只会向您展示在sql Server上证明这一结果。考虑一下该查询,该查询甚至在表达式中包含一个CAST。从查询计划来看,该表达式sum(cast(number as bigint))仅采用一次,定义为DEFINE:([Expr1005]=SUM([Expr1006]))

set showplan_text on
select type, sum(cast(number as bigint))
from master..spt_values
group by type
having sum(cast(number as bigint)) > 100000

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  |--Filter(WHERE:([Expr1005]>(100000)))
       |--Hash Match(Aggregate, HASH:([Expr1004]), RESIDUAL:([Expr1004] = [Expr1004]) DEFINE:([Expr1005]=SUM([Expr1006])))
            |--Compute Scalar(DEFINE:([Expr1004]=CONVERT(nchar(3),[mssqlsystemresource].[sys].[spt_values].[type],0), [Expr1006]=CONVERT(bigint,[mssqlsystemresource].[sys].[spt_values].[number],0)))
                 |--Index Scan(OBJECT:([mssqlsystemresource].[sys].[spt_values].[ix2_spt_values_nu_nc]))

上面可能不太明显,因为它没有显示SELECT结果,因此我*10在下面的查询添加一个。请注意,它现在包括一个额外的步骤DEFINE:([Expr1006]=[Expr1005]*(10))(步骤从下至上),这表明新表达式需要它执行额外的计算。但是,即使这是经过优化的,因为它不会重新计算整个表达式- 只是,它使用的是Expr1005并将其乘以10!

set showplan_text on
select type, sum(cast(number as bigint))*10
from master..spt_values
group by type
having sum(cast(number as bigint)) > 100000

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  |--Compute Scalar(DEFINE:([Expr1006]=[Expr1005]*(10)))
       |--Filter(WHERE:([Expr1005]>(100000)))
            |--Hash Match(Aggregate, HASH:([Expr1004]), RESIDUAL:([Expr1004] = [Expr1004]) DEFINE:([Expr1005]=SUM([Expr1007])))
                 |--Compute Scalar(DEFINE:([Expr1004]=CONVERT(nchar(3),[mssqlsystemresource].[sys].[spt_values].[type],0), [Expr1007]=CONVERT(bigint,[mssqlsystemresource].[sys].[spt_values].[number],0)))
                      |--Index Scan(OBJECT:([mssqlsystemresource].[sys].[spt_values].[ix2_spt_values_nu_nc]))

至少考虑主要数据库(例如Postgresql,Sybase,Oracle,DB2,Firebird,MysqL)的情况,其他所有DBMS也是如何工作的,这很有可能。

SQLServer 2022/1/1 18:51:20 有485人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶