यह निर्भर करता है।
सबसे पहले
सामान्य तालिका अभिव्यक्ति क्या है?
ए (गैर-पुनरावर्ती) सीटीई को अन्य निर्माणों के समान ही माना जाता है जिसे एसक्यूएल सर्वर में इनलाइन टेबल एक्सप्रेशन के रूप में भी इस्तेमाल किया जा सकता है। व्युत्पन्न तालिकाएँ, दृश्य और इनलाइन तालिका मूल्यवान कार्य। ध्यान दें कि जब बीओएल कहता है कि एक सीटीई "अस्थायी परिणाम सेट के रूप में सोचा जा सकता है" यह पूरी तरह तार्किक विवरण है। अक्सर यह अपने आप में भौतिक नहीं होता है।
अस्थायी तालिका क्या है?
यह tempdb में डेटा पृष्ठों पर संग्रहीत पंक्तियों का संग्रह है। डेटा पेज आंशिक रूप से या पूरी तरह से मेमोरी में रह सकते हैं। इसके अतिरिक्त अस्थायी तालिका को अनुक्रमित किया जा सकता है और इसमें स्तंभ आँकड़े हो सकते हैं।
परीक्षण डेटा
CREATE TABLE T(A INT IDENTITY PRIMARY KEY, B INT , F CHAR(8000) NULL);
INSERT INTO T(B)
SELECT TOP (1000000) 0 + CAST(NEWID() AS BINARY(4))
FROM master..spt_values v1,
master..spt_values v2;
उदाहरण 1
WITH CTE1 AS
(
SELECT A,
ABS(B) AS Abs_B,
F
FROM T
)
SELECT *
FROM CTE1
WHERE A = 780
उपरोक्त योजना में सूचना CTE1 का कोई उल्लेख नहीं है। यह सीधे आधार तालिकाओं तक पहुँचता है और इसके साथ वैसा ही व्यवहार किया जाता है जैसे
SELECT A,
ABS(B) AS Abs_B,
F
FROM T
WHERE A = 780
सीटीई को यहां एक मध्यवर्ती अस्थायी तालिका में परिवर्तित करके पुनर्लेखन व्यापक रूप से प्रति-उत्पादक होगा।
की सीटीई परिभाषा को अमल में लाना
SELECT A,
ABS(B) AS Abs_B,
F
FROM T
लगभग 8GB डेटा को एक अस्थायी तालिका में कॉपी करना शामिल होगा, फिर भी इसमें से चयन करने का ओवरहेड भी है।
उदाहरण 2
WITH CTE2
AS (SELECT *,
ROW_NUMBER() OVER (ORDER BY A) AS RN
FROM T
WHERE B % 100000 = 0)
SELECT *
FROM CTE2 T1
CROSS APPLY (SELECT TOP (1) *
FROM CTE2 T2
WHERE T2.A > T1.A
ORDER BY T2.A) CA
उपरोक्त उदाहरण में मेरी मशीन पर लगभग 4 मिनट लगते हैं।
1,000,000 बेतरतीब ढंग से उत्पन्न मूल्यों की केवल 15 पंक्तियाँ विधेय से मेल खाती हैं लेकिन इनका पता लगाने के लिए महंगा टेबल स्कैन 16 बार होता है।
इंटरमीडिएट के परिणाम को अमल में लाने के लिए यह एक अच्छा उम्मीदवार होगा। समतुल्य अस्थायी तालिका पुनर्लेखन में 25 सेकंड लगे।
INSERT INTO #T
SELECT *,
ROW_NUMBER() OVER (ORDER BY A) AS RN
FROM T
WHERE B % 100000 = 0
SELECT *
FROM #T T1
CROSS APPLY (SELECT TOP (1) *
FROM #T T2
WHERE T2.A > T1.A
ORDER BY T2.A) CA
एक अस्थायी तालिका में एक क्वेरी के हिस्से का मध्यवर्ती भौतिककरण कभी-कभी उपयोगी हो सकता है, भले ही इसका केवल एक बार मूल्यांकन किया गया हो - जब यह भौतिक परिणाम पर आंकड़ों का लाभ उठाते हुए शेष क्वेरी को पुन:संकलित करने की अनुमति देता है। इस दृष्टिकोण का एक उदाहरण SQL कैट लेख व्हेन टू ब्रेक डाउन कॉम्प्लेक्स क्वेरीज़ में है।
कुछ परिस्थितियों में SQL सर्वर एक मध्यवर्ती परिणाम को कैश करने के लिए स्पूल का उपयोग करेगा, उदा। एक सीटीई का, और उस उप वृक्ष का पुनर्मूल्यांकन करने से बचें। यह (माइग्रेट) कनेक्ट आइटम में चर्चा की गई है सीटीई या व्युत्पन्न तालिकाओं के मध्यवर्ती भौतिककरण को मजबूर करने के लिए एक संकेत प्रदान करें। हालाँकि इस पर कोई आँकड़े नहीं बनाए गए हैं और भले ही स्पूल की गई पंक्तियों की संख्या अनुमानित से बहुत भिन्न हो, प्रगति निष्पादन योजना के लिए प्रतिक्रिया में गतिशील रूप से अनुकूल होना संभव नहीं है (कम से कम वर्तमान संस्करणों में। अनुकूली क्वेरी योजनाएं संभव हो सकती हैं भविष्य)।