MSSQL 2005यूडीएफ बनाम प्रत्यक्ष एसक्यूएल प्रदर्शन
मैं एक में एक अदिश यूडीएफ के साथ आज चारों ओर खेल रहा था जहां बयान कॉल करने के साथ जुड़े लागत और कब मतभेद आदि
मैं से कुछ देखने के का उपयोग करना मैं 2 मूल सारणी से शुरू कर रहा हूँ। ग्राहक जिसमें 1 मिलियन पंक्तियां हैं। और खरीद जिसमें 100,000 है। दोनों में प्राथमिक कुंजी के रूप में एक ऑटो पहचान कॉलम है। कोई अन्य अनुक्रमणिका परिभाषित नहीं है।
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
SET STATISTICS IO ON
SELECT * FROM Customer C
INNER JOIN Purchases P on C.[IDENTITY] = P.CustomerID
WHERE P.Amount > 1000
SET STATISTICS IO OFF
यह
Table 'Customer'. Scan count 0, logical reads 3295, physical reads 1, read-ahead reads 32, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Purchases'. Scan count 1, logical reads 373, physical reads 1, read-ahead reads 370, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
के आईओ आंकड़े देता है तो बस एक अदिश यूडीएफ के प्रभाव मैं तो बस P.Amount> 1000 में ले जाया गया एक यूडीएफ को देखने के लिए। समारोह इस प्रकार है:
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
SET STATISTICS IO ON
SELECT * FROM Customer C
INNER JOIN Purchases P on C.[IDENTITY] = P.CustomerID
WHERE dbo.HighValuePurchase(P.Amount) = '1'
SET STATISTICS IO OFF
मैं बदतर चलाने के लिए इस उम्मीद कर रहा था:
CREATE FUNCTION [dbo].[HighValuePurchase]
(
@value int
)
RETURNS bit
AS
BEGIN
DECLARE @highValue bit
SET @highValue = '0'
IF @value > 1000
BEGIN
SET @highValue = '1'
END
RETURN @highValue
END
तो मैं तो निम्न क्वेरी भाग गया। इस क्वेरी लौटे निम्नलिखित आईओ आंकड़े:
Table 'Purchases'. Scan count 1, logical reads 373, physical reads 1, read-ahead reads 370, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Customer'. Scan count 1, logical reads 35, physical reads 3, read-ahead reads 472, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
यह भी तेजी से> 1000 क्वेरी से लौट आए। जबकि एक ही पंक्तियों को वापस कर दिया गया था, यूडीएफ को बुलाए जाने वाले आदेश का क्रम स्वचालित रूप से सी [पहचान] द्वारा क्रमबद्ध किया गया था, जहां दूसरी क्वेरी निरस्त दिखाई दे रही थी। यह संभवतः निष्पादन योजनाओं में संयोजनों के तरीके के कारण होता है। योजनाओं की रूपरेखा नीचे है।
गैर यूडीएफ के लिए निष्पादन योजना खरीद के लिए क्लस्टर्ड इंडेक्स स्कैन दिखाती है और क्लस्टर्ड इंडेक्स नेस्टेड जॉइन में संयुक्त ग्राहकों की तलाश करता है।
यूडीएफ संस्करण के लिए निष्पादन योजना खरीद के लिए क्लस्टर्ड इंडेक्स स्कैन दिखाती है, फिर फ़िल्टर, फिर एक प्रकार। ग्राहक पर क्लस्टर इंडेक्स स्कैन है। फिर परिणाम मर्ज में शामिल होते हैं।
मुझे यकीन है कि इसे इंडेक्स आदि की कमी के साथ करना है, लेकिन मुझे यकीन नहीं है कि ये परिणाम क्यों हैं। मैंने यूडीएफ का दर्दनाक धीमा गति से अनुभव किया है और हर कोई कहता है कि उनका उपयोग करना एक बुरा विचार है, इसलिए मैंने इस परीक्षण को एक साथ फेंक दिया। मैं वर्तमान में समझा नहीं सकता कि यूडीएफ संस्करण इतना बेहतर क्यों प्रतीत होता है।
इससे संबंधित कुछ जानकारी मिली: http://sqlinthewild.co.za/index.php/2009/04/29/functions-io-statistics-and-the-execution-plan/ मैं अभी भी ' उपर्युक्त क्वेरी के लिए "सत्य" आईओ आंकड़े प्राप्त नहीं करते हैं, लेकिन यह कम से कम इसे समझाने में मदद करता है। – Equixor
ऐसा नहीं लगता है कि आप इस मंच पर एक उत्तर प्राप्त करने जा रहे हैं। शायद एक और एसक्यूएल विशिष्ट साइट पर पोस्ट करना चाहते हैं। अर्थात। http://www.sqlservercentral.com/Forums/ –
पृथ्वी पर आप कभी भी कॉलम पहचान नाम क्यों देंगे ??? क्यों न सिर्फ ग्राहक आईडी दोनों टेबलों में नाम ??? इस तरह की चीजों को नाम देने से अगले गरीब व्यक्ति को मार डालना होगा जो आपके बाद इस प्रणाली पर काम करना होगा। –