2011-12-02 13 views
5

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 क्वेरी से लौट आए। जबकि एक ही पंक्तियों को वापस कर दिया गया था, यूडीएफ को बुलाए जाने वाले आदेश का क्रम स्वचालित रूप से सी [पहचान] द्वारा क्रमबद्ध किया गया था, जहां दूसरी क्वेरी निरस्त दिखाई दे रही थी। यह संभवतः निष्पादन योजनाओं में संयोजनों के तरीके के कारण होता है। योजनाओं की रूपरेखा नीचे है।

गैर यूडीएफ के लिए निष्पादन योजना खरीद के लिए क्लस्टर्ड इंडेक्स स्कैन दिखाती है और क्लस्टर्ड इंडेक्स नेस्टेड जॉइन में संयुक्त ग्राहकों की तलाश करता है।

यूडीएफ संस्करण के लिए निष्पादन योजना खरीद के लिए क्लस्टर्ड इंडेक्स स्कैन दिखाती है, फिर फ़िल्टर, फिर एक प्रकार। ग्राहक पर क्लस्टर इंडेक्स स्कैन है। फिर परिणाम मर्ज में शामिल होते हैं।

मुझे यकीन है कि इसे इंडेक्स आदि की कमी के साथ करना है, लेकिन मुझे यकीन नहीं है कि ये परिणाम क्यों हैं। मैंने यूडीएफ का दर्दनाक धीमा गति से अनुभव किया है और हर कोई कहता है कि उनका उपयोग करना एक बुरा विचार है, इसलिए मैंने इस परीक्षण को एक साथ फेंक दिया। मैं वर्तमान में समझा नहीं सकता कि यूडीएफ संस्करण इतना बेहतर क्यों प्रतीत होता है।

+0

इससे संबंधित कुछ जानकारी मिली: http://sqlinthewild.co.za/index.php/2009/04/29/functions-io-statistics-and-the-execution-plan/ मैं अभी भी ' उपर्युक्त क्वेरी के लिए "सत्य" आईओ आंकड़े प्राप्त नहीं करते हैं, लेकिन यह कम से कम इसे समझाने में मदद करता है। – Equixor

+0

ऐसा नहीं लगता है कि आप इस मंच पर एक उत्तर प्राप्त करने जा रहे हैं। शायद एक और एसक्यूएल विशिष्ट साइट पर पोस्ट करना चाहते हैं। अर्थात। http://www.sqlservercentral.com/Forums/ –

+0

पृथ्वी पर आप कभी भी कॉलम पहचान नाम क्यों देंगे ??? क्यों न सिर्फ ग्राहक आईडी दोनों टेबलों में नाम ??? इस तरह की चीजों को नाम देने से अगले गरीब व्यक्ति को मार डालना होगा जो आपके बाद इस प्रणाली पर काम करना होगा। –

उत्तर

1
  • यदि आप Purchases.CustomerID पर शामिल होना चाहते हैं तो आपको उस पर एक इंडेक्स रखना चाहिए।
  • यदि आप अक्सर मूल्य सीमाओं पर पूछताछ करते हैं तो आपको उस पर एक इंडेक्स भी रखना चाहिए।

जैसा कि आप SQL सर्वर से दो बुरी योजनाओं के बीच चयन करने के लिए कह रहे हैं।

SQL सर्वर अनुमान लगा सकता है कि > 1000 क्वेरी द्वारा कितनी खरीदारी की जाएगी, और उस पर आधारित एक योजना चुनेंगे।

हालांकि यह अनुमान नहीं लगा सकता कि यूडीएफ क्वेरी द्वारा कितने कवर किए जाएंगे, इसलिए एक अलग योजना चुन सकते हैं। क्योंकि यह अज्ञानता पर जा रहा है क्योंकि यह अनुमान लगाया जा सकता है कि यह कितना अच्छा अनुमान है, यह अन्य योजना की तुलना में बेहतर या बदतर हो सकता है।

आप जेनरेट की गई योजनाएं देख सकते हैं और यह आपको प्रत्येक योजना में वास्तविक पंक्तियों की अनुमानित संख्या और वास्तविक संख्या भी बताएगा। उन अनुमानित संख्या प्रत्येक मामले में योजना की पसंद के लिए खाते हैं।

संबंधित मुद्दे