有没有在同一个查询的SQL implementaton多个呼叫的标准,同一集合函数?
例如,请考虑下面的示例中,基于流行的示例模式:
SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
HAVING SUM(OrderPrice)>1000
据推测,它需要计算时间来计算SUM(OrderPrice)的值。 难道这产生的费用对每个参考聚合函数,或者是存储为特定查询的结果?
或者说,是有这个情况下SQL引擎实现没有标准?
虽然我曾与许多不同的数据库管理系统的工作,我只能告诉你,证明此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]))
它可能不是很明显上面,因为它不显示选择的结果,所以我加了*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]))
这很可能是所有其他DBMS是如何工作的,以及,至少考虑到主要的PostgreSQL的即时,Sybase,甲骨文,DB2,火鸟,MySQL的。