2011-12-05 16 views
5

यह प्रश्न बिज़ारेस्ट व्यवहार के लिए स्पष्टीकरण प्राप्त करने के बारे में समाधान खोजने के बारे में इतना कुछ नहीं है जिसे मैंने कभी भी SQL सर्वर से देखा है।संग्रहीत प्रक्रिया प्रदर्शन - यह वाइल्ड है?

मैं निम्नलिखित हस्ताक्षर के साथ एक संग्रहीत प्रक्रिया थी:

alter procedure MySP @param1 uniqueidentifier, 
        @param2 uniqueidentifier, 
        @param3 uniqueidentifier 

मापदंडों के एक विशिष्ट समूह को देखते हुए, इस proc एक बहुत लंबे समय सी # से चलाने के लिए ले जा रही थी (SqlCommand.ExecuteReader() का प्रयोग करके) - लगभग 2 मिनट। प्रत्यक्ष क्वेरी सत्र में समान पैरामीटर का उपयोग करके, एसपी 2 सेकंड के भीतर चला गया।

यह एक लंबे समय ले लिया है, और मैं भी हम कैसे इस समाधान पर ठोकर खाई को समझाने की कोशिश नहीं करेंगे, लेकिन यह हम क्या किया है:

की सपा शुरुआत में, हम 3 स्थानीय चर घोषित कर दिया और उन्हें मानकों, इसलिए तरह के मूल्यों को असाइन किया गया:

declare @param1_copy uniqueidentifier, 
     @param2_copy uniqueidentifier, 
     @param3_copy uniqueidentifier 

select @param1_copy = @param1, 
     @param2_copy = @param2, 
     @param3_copy = @param3 

और फिर, के सपा बाकी हिस्सों में हम स्थानीय प्रतियों के साथ इनपुट पैरामीटर के सभी संदर्भ प्रतिस्थापित।

वोला। एसपी 2 सेकंड के तहत निष्पादित। और यहां टीम gobsmacked है।

अब, महिलाओं और सज्जनो, क्या कोई इस व्यवहार को समझा सकता है?

उत्तर

8

यह parameter sniffing जैसा लगता है।

माइक्रोसॉफ्ट के परिभाषा से:

"पैरामीटर सूँघने" एक प्रक्रिया है जिसके तहत एसक्यूएल सर्वर के निष्पादन वातावरण संकलन या रखता दौरान "sniffs" वर्तमान पैरामीटर मान को संदर्भित करता है, और क्वेरी अनुकूलक के साथ पास कर देता है ताकि वे संभावित तेजी से क्वेरी निष्पादन योजनाओं को उत्पन्न करने के लिए इस्तेमाल किया जा सकता है। "वर्तमान" शब्द कथन कॉल में मौजूद पैरामीटर मानों को संदर्भित करता है जो संकलन या पुनर्मूल्यांकन का कारण बनता है।

लगता है आप पहले से ही एक ठीक है, एक और EXEC उपयोग करने के लिए ... RECOMPILE के साथ होगा समझ गए होंगे की तरह:

जब असामान्य पैरामीटर मान, "EXEC के साथ एक संग्रहीत प्रक्रिया को क्रियान्वित करने ... RECOMPILE के साथ "यह सुनिश्चित करने के लिए उपयोग किया जा सकता है कि ताजा क्वेरी योजना एक मौजूदा कैश योजना को प्रतिस्थापित नहीं करती है जिसे ठेठ पैरामीटर मानों का उपयोग करके संकलित किया गया था।

+1

कमाल। हम बिना किसी समझ के पाठ्यपुस्तक समाधान पर ठोकर खाई! संग्रहीत प्रक्रिया पैरामीटर के साथ भ्रम से बचने के लिए –

3

मैं एरलैंड सोमरस्क द्वारा उत्कृष्ट लेख पढ़ने का सुझाव देता हूं: Slow in the Application, Fast in SSMS? Understanding Performance Mysteries

इस मुद्दे पर इसका पूरा विवरण है।

सामान्य रूप से, जब एक क्वेरी योजना कैश की जाती है, तो कुछ क्वेरी सेटिंग्स कैश कुंजी में उपयोग की जाती हैं। डिफ़ॉल्ट सेटिंग्स एसएसएमएस सेटिंग्स में ये सेटिंग्स अलग-अलग कनेक्शन स्ट्रिंग्स पर भिन्न होती हैं, इसलिए अलग-अलग क्वेरी योजनाएं मौजूद हो सकती हैं।

+0

शायद 'पैरामीटर' से भिन्न शब्द का उपयोग करके सबसे अच्छा उपयोग करें। –

+0

@ मार्टिनस्मिथ - उचित बिंदु। 'सेटिंग्स' में बदल गया - आपको क्या लगता है? – Oded

+0

मेरे लिए अच्छा लगता है। डीएमओ इन्हें मिल सकता है 'sys.dm_exec_plan_attributes' –

0

मेरे पास एक समान स्थिति थी जब मेरे पास xml प्रकार का पैरामीटर था और निष्पादित करने में बहुत समय लग रहा था।मैंने एक ही दृष्टिकोण किया और एक स्थानीय चर बनाया और पैरामीटर मान पास किया :)

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

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