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

मल्टी-स्टेटमेंट टेबल वैल्यूड फंक्शन बनाम इनलाइन टेबल वैल्यूड फंक्शन

मैट की टिप्पणी पर शोध करते हुए, मैंने अपने मूल कथन को संशोधित किया है। वह सही है, इनलाइन टेबल वैल्यूड फंक्शन (आईटीवीएफ) और मल्टी-स्टेटमेंट टेबल वैल्यूड फंक्शन (एमएसटीवीएफ) के बीच प्रदर्शन में अंतर होगा, भले ही वे दोनों केवल एक सेलेक्ट स्टेटमेंट को निष्पादित करें। SQL सर्वर किसी ITVF को कुछ हद तक VIEW . की तरह व्यवहार करेगा इसमें यह विचाराधीन तालिकाओं पर नवीनतम आंकड़ों का उपयोग करके निष्पादन योजना की गणना करेगा। एक MSTVF आपके SELECT स्टेटमेंट की पूरी सामग्री को एक टेबल वेरिएबल में भरने और फिर उसमें शामिल होने के बराबर है। इस प्रकार, कंपाइलर MSTVF में तालिकाओं पर किसी तालिका आँकड़े का उपयोग नहीं कर सकता है। इसलिए, सभी चीजें समान हैं, (जो वे शायद ही कभी होती हैं), आईटीवीएफ एमएसटीवीएफ से बेहतर प्रदर्शन करेगा। मेरे परीक्षणों में, पूरा होने के समय में प्रदर्शन अंतर नगण्य था, हालांकि आंकड़ों के दृष्टिकोण से, यह ध्यान देने योग्य था।

आपके मामले में, दो कार्य कार्यात्मक रूप से समकक्ष नहीं हैं। MSTV फ़ंक्शन हर बार कॉल किए जाने पर एक अतिरिक्त क्वेरी करता है और, सबसे महत्वपूर्ण बात, ग्राहक आईडी पर फ़िल्टर करता है। एक बड़ी क्वेरी में, ऑप्टिमाइज़र अन्य प्रकार के जॉइन का लाभ नहीं उठा पाएगा क्योंकि इसे पास किए गए प्रत्येक ग्राहक के लिए फ़ंक्शन को कॉल करने की आवश्यकता होगी। हालाँकि, यदि आपने अपने MSTV फ़ंक्शन को इस प्रकार फिर से लिखा है:

CREATE FUNCTION MyNS.GetLastShipped()
RETURNS @CustomerOrder TABLE
    (
    SaleOrderID    INT         NOT NULL,
    CustomerID      INT         NOT NULL,
    OrderDate       DATETIME    NOT NULL,
    OrderQty        INT         NOT NULL
    )
AS
BEGIN
    INSERT @CustomerOrder
    SELECT a.SalesOrderID, a.CustomerID, a.OrderDate, b.OrderQty
    FROM Sales.SalesOrderHeader a 
        INNER JOIN Sales.SalesOrderHeader b
            ON a.SalesOrderID = b.SalesOrderID
        INNER JOIN Production.Product c 
            ON b.ProductID = c.ProductID
    WHERE a.OrderDate = (
                        Select Max(SH1.OrderDate)
                        FROM Sales.SalesOrderHeader As SH1
                        WHERE SH1.CustomerID = A.CustomerId
                        )
    RETURN
END
GO

एक प्रश्न में, ऑप्टिमाइज़र उस फ़ंक्शन को एक बार कॉल करने और बेहतर निष्पादन योजना बनाने में सक्षम होगा लेकिन यह अभी भी एक समकक्ष, गैर-पैरामीटरयुक्त ITVS या VIEW से बेहतर नहीं होगा। ।

जब संभव हो तो आईटीवीएफ को एमएसटीवीएफ पर प्राथमिकता दी जानी चाहिए क्योंकि तालिका में कॉलम से डेटाटाइप, शून्यता और संयोजन, जबकि आप उन गुणों को बहु-कथन तालिका मूल्यवान फ़ंक्शन में घोषित करते हैं और महत्वपूर्ण बात यह है कि आपको आईटीवीएफ से बेहतर निष्पादन योजनाएं मिलेंगी। मेरे अनुभव में, मुझे ऐसी कई परिस्थितियाँ नहीं मिली हैं जहाँ एक ITVF एक दृश्य से बेहतर विकल्प था, लेकिन माइलेज भिन्न हो सकता है।

मैट को धन्यवाद।

जोड़

चूंकि मैंने इसे हाल ही में देखा है, इसलिए वेन शेफ़ील्ड द्वारा इनलाइन टेबल वैल्यूड फ़ंक्शंस और मल्टी-स्टेटमेंट फ़ंक्शंस के बीच प्रदर्शन अंतर की तुलना करते हुए एक उत्कृष्ट विश्लेषण किया गया है।

उनका मूल ब्लॉग पोस्ट।

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. SQL सर्वर में सम्मिलन के क्रम को कैसे बनाए रखें

  2. मैं प्राथमिक कुंजी को AUTOINCREMENT के रूप में कैसे बना सकता हूँ?

  3. SQL सर्वर 2014 वृद्धिशील सांख्यिकी

  4. SQL सर्वर 2012 OPENROWSET त्रुटि का उपयोग करके एक्सेस 2007 डेटा को क्वेरी कर रहा है

  5. SQL सर्वर CPU प्रदर्शन समस्याओं का निवारण