Birçok farklı DBMS ile çalışmış olsam da, bunu yalnızca SQL Server'da kanıtlamanın sonuçlarını göstereceğim. İfadede bir CAST içeren bile bu sorguyu düşünün. Sorgu planına bakarak, sum(cast(number as bigint))
ifadesi yalnızca bir kez alınır ve bu değer DEFINE:([Expr1005]=SUM([Expr1006]))
olarak tanımlanır.
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]))
o SEÇ bir sonuç vermezse, çünkü yukarıda çok belirgin olmayabilir, bu yüzden aşağıda sorguya bir *10
ekledik. Artık yeni bir ifadenin fazladan bir hesaplama yapmasını gerektirdiğini gösteren bir ek adım olan DEFINE:([Expr1006]=[Expr1005]*(10))
(aşağıdan yukarıya doğru adımlar) içerdiğine dikkat edin. Yine de, bu, tüm ifadeyi yeniden hesaplayamadığı için optimize edilmiş olsa bile, sadece Expr1005'i alıyor ve bunu 10 ile çarpıyor!
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]))
Bu, tüm diğer DBMS en azından önemli olanları yani PostgreSQL, Sybase, Oracle, DB2, Firebird, MySQL de dikkate alınmak nasıl çalıştığını çok muhtemeldir.