Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

कौन अधिक प्रदर्शनकारी हैं, सीटीई या अस्थायी टेबल?

यह निर्भर करता है।

सबसे पहले

सामान्य तालिका अभिव्यक्ति क्या है?

ए (गैर-पुनरावर्ती) सीटीई को अन्य निर्माणों के समान ही माना जाता है जिसे एसक्यूएल सर्वर में इनलाइन टेबल एक्सप्रेशन के रूप में भी इस्तेमाल किया जा सकता है। व्युत्पन्न तालिकाएँ, दृश्य और इनलाइन तालिका मूल्यवान कार्य। ध्यान दें कि जब बीओएल कहता है कि एक सीटीई "अस्थायी परिणाम सेट के रूप में सोचा जा सकता है" यह पूरी तरह तार्किक विवरण है। अक्सर यह अपने आप में भौतिक नहीं होता है।

अस्थायी तालिका क्या है?

यह 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 सर्वर एक मध्यवर्ती परिणाम को कैश करने के लिए स्पूल का उपयोग करेगा, उदा। एक सीटीई का, और उस उप वृक्ष का पुनर्मूल्यांकन करने से बचें। यह (माइग्रेट) कनेक्ट आइटम में चर्चा की गई है सीटीई या व्युत्पन्न तालिकाओं के मध्यवर्ती भौतिककरण को मजबूर करने के लिए एक संकेत प्रदान करें। हालाँकि इस पर कोई आँकड़े नहीं बनाए गए हैं और भले ही स्पूल की गई पंक्तियों की संख्या अनुमानित से बहुत भिन्न हो, प्रगति निष्पादन योजना के लिए प्रतिक्रिया में गतिशील रूप से अनुकूल होना संभव नहीं है (कम से कम वर्तमान संस्करणों में। अनुकूली क्वेरी योजनाएं संभव हो सकती हैं भविष्य)।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 120 मिलियन रिकॉर्ड अपडेट करने का सबसे तेज़ तरीका

  2. SQL में पासिंग पैरामीटर क्या है और मुझे इसकी आवश्यकता क्यों है?

  3. एकाधिक तालिकाओं के लिए विदेशी कुंजी

  4. Ubuntu 18.04 पर SQL सर्वर कैसे स्थापित करें

  5. डेटाबेस को खोला नहीं जा सकता क्योंकि यह संस्करण 782 है। यह सर्वर संस्करण 706 और इससे पहले के संस्करण का समर्थन करता है। डाउनग्रेड पथ समर्थित नहीं है