केवल टिप्पणियों में प्रायोगिक निष्कर्षों को सारांशित करने के लिए यह एक किनारे का मामला लगता है जो तब होता है जब आपके पास एक ही तालिका में दो गणना किए गए कॉलम होते हैं, एक persisted
और एक निरंतर नहीं होता है और उन दोनों की परिभाषा समान होती है।
क्वेरी के लिए योजना में
SELECT id5p
FROM dbo.persist_test;
तालिका persist_test
केवल id
स्तंभ का उत्सर्जन करती है। अगली गणना स्केलर 5 से गुणा करती है और एक कॉलम को id5
इस तथ्य के बावजूद बुलाया जाता है कि इस कॉलम को क्वेरी में संदर्भित नहीं किया गया है। अंतिम संगणकीय स्केलर id5
एक कॉलम के रूप में और आउटपुट के मान को लेता है id5p
।
क्वेरी ऑप्टिमाइज़र डीप डाइव - पार्ट 2 में बताए गए ट्रेस झंडे का उपयोग करना (अस्वीकरण: ये ट्रेस झंडे अनियोजित / असमर्थित हैं) और क्वेरी को देख रहे हैं
SELECT id5,
id5p,
( id * 5 )
FROM dbo.persist_test
OPTION (QUERYTRACEON 3604, QUERYTRACEON 8606);
आउटपुट देता है
परियोजना सामान्यीकरण से पहले पेड़
LogOp_Project
LogOp_Get TBL: dbo.persist_test dbo.persist_test TableID=1717581157 TableReferenceID=0 IsRow: COL: IsBaseRow1002
AncOp_PrjList
AncOp_PrjEl QCOL: [tempdb].[dbo].[persist_test].id5
ScaOp_Arithmetic x_aopMult
ScaOp_Identifier QCOL: [tempdb].[dbo].[persist_test].id
ScaOp_Const TI(int,ML=4) XVAR(int,Not Owned,Value=5)
AncOp_PrjEl QCOL: [tempdb].[dbo].[persist_test].id5p
ScaOp_Arithmetic x_aopMult
ScaOp_Identifier QCOL: [tempdb].[dbo].[persist_test].id
ScaOp_Const TI(int,ML=4) XVAR(int,Not Owned,Value=5)
AncOp_PrjEl COL: Expr1004
ScaOp_Arithmetic x_aopMult
ScaOp_Identifier QCOL: [tempdb].[dbo].[persist_test].id
ScaOp_Const TI(int,ML=4) XVAR(int,Not Owned,Value=5)
परियोजना के सामान्यीकरण के बाद वृक्ष
LogOp_Project
LogOp_Get TBL: dbo.persist_test dbo.persist_test TableID=1717581157 TableReferenceID=0 IsRow: COL: IsBaseRow1002
AncOp_PrjList
AncOp_PrjEl QCOL: [tempdb].[dbo].[persist_test].id5
ScaOp_Identifier QCOL: [tempdb].[dbo].[persist_test].id5
AncOp_PrjEl QCOL: [tempdb].[dbo].[persist_test].id5p
ScaOp_Identifier QCOL: [tempdb].[dbo].[persist_test].id5
AncOp_PrjEl COL: Expr1004
ScaOp_Identifier QCOL: [tempdb].[dbo].[persist_test].id5
तो ऐसा प्रतीत होता है कि सभी गणना किए गए कॉलम की परिभाषाएँ विस्तारित हो जाती हैं, फिर प्रोजेक्ट सामान्यीकरण चरण के दौरान सभी समान अभिव्यक्तियाँ गणना किए गए स्तंभों से वापस मिल जाती हैं और यह केवल id5
इस मामले में मिलान करने के लिए होता है । यानी यह persisted
कॉलम को कोई वरीयता नहीं देता है ।
यदि तालिका निम्नलिखित परिभाषा के साथ फिर से बनाई गई है
CREATE TABLE dbo.persist_test (
id INT NOT NULL
, id5p AS (5 * id) PERSISTED
, id5 AS (5 * id)
);
तब id5
या तो अनुरोध या id5p
रनटाइम पर गणना करने के बजाय डेटा के निरंतर संस्करण को पढ़ने से संतुष्ट हो जाएगा ताकि मिलान कॉलम क्रम में (कम से कम इस मामले में) होने लगे।
[tempdb].[dbo].[persist_test].id
और यह जारी रहने के बावजूद मूल्य की गणना करता है।