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