हालांकि मैंने कई अलग-अलग डीबीएमएस के साथ काम किया है, मैं केवल आपको SQL सर्वर पर इसे साबित करने का परिणाम दिखाऊंगा। इस क्वेरी पर विचार करें, जिसमें अभिव्यक्ति में एक 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]))
इस तरह अन्य सभी डीबीएमएस के रूप में अच्छी तरह से काम करते हैं, कम से कम प्रमुख हैं अर्थात PostgreSQL, Sybase, ओरेकल, डीबी 2, Firebird, MySQL पर विचार बहुत संभावना है।