2012-01-29 10 views
6

मुझे किस कारकों से अवगत होना चाहिए जिससे अत्यधिक संग्रहित प्रक्रिया पुनर्मूल्यांकन हो सकता है?एसक्यूएल सर्वर पर संग्रहीत प्रक्रिया पुनर्मूल्यांकन के कारण कौन से कारक हो सकते हैं?

कोड के उदाहरण जो संग्रहित प्रक्रिया को पुन: संकलित करने के कारण उपयोगी होंगे। यदि संभव हो तो एक पुनर्मूल्यांकन से बचने का उद्देश्य प्रदर्शन में सुधार करना चाहिए।

गतिशील एसक्यूएल और परिवर्तनीय पथ विभिन्न आउटपुट (या तो डेटा प्रकार और/या स्तंभों की संख्या) के परिणामस्वरूप ऐसा लगता है कि वे एक समस्या पेश कर सकते हैं। क्या धारणा सही हैं? क्या अन्य उदाहरण हैं।

संपादित करें: मुझे एक और उदाहरण मिला। प्रवाह नियंत्रण कथन में एक अस्थायी तालिका बनाना एक पुन: संकलन का कारण बन जाएगा।

+0

हां। अब सवाल क्या है? –

+2

मुझे लगता है कि आपको एक विशिष्ट प्रश्न पूछने की आवश्यकता है। –

उत्तर

17

वहाँ एक संग्रहीत प्रक्रिया के रखता सुनिश्चित करने के लिए कुछ तरीके हैं:

  • WITH RECOMPILE का उपयोग कर,
  • संग्रहीत प्रक्रिया गतिशील बनाने (लगता है exec())
  • sp_recompile साथ recompile के लिए proc अंकन।
  • स्कीमा कि एक कैश्ड क्वेरी योजना पर
  • बुला DBCC FREEPROCCACHE
  • निर्भर करता है क्वेरी स्तर एक proc के भीतर एक व्यक्ति बयान RECOMPILE क्वेरी संकेत (SQL 2008) के साथ कंपाइल किया जा सकता है पर बदल रहा है। Recompilation

    ऊपर सूचीबद्ध कड़ी मेहनत से कारकों के अलावा में

कारक, क्या कार्यविधि recompilation संग्रहीत का कारण बनता है? खैर, बहुत सी चीजें। इनमें से कुछ उपरोक्त सूची के साथ जुड़े हुए हैं, लेकिन मैं उन्हें फिर से पेश करना चाहता हूं बी/सी यह स्पष्ट नहीं हो सकता है।

  • लगाते या डेटा के बहुत सारे को हटाने (सूचकांकों में डेटा घनत्व & टेबल अक्सर क्वेरी योजनाओं को नियंत्रित करता है)
  • पुनर्निर्माण अनुक्रमित (अंतर्निहित वस्तुओं के लिए एक परिवर्तन)
  • बनाना/अस्थायी तालिकाओं छोड़ने (फिर से, अंतर्निहित DML परिवर्तन)।
  • क्वेरी योजना उम्र बाहर (हाल ही में उपयोग नहीं लगता है और एसक्यूएल चाहते की स्मृति उपयोग को साफ करने के)

यह वह जगह है कोई एक विस्तृत सूची भी तरह से। क्वेरी ऑप्टिमाइज़र विकसित होता है और इससे कोई फर्क नहीं पड़ता कि आप कितनी देर तक SQL सर्वर का उपयोग कर रहे हैं।

: लेकिन यहाँ कुछ संसाधन है कि काम का हो सकता है लेकिन देखो और अधिक!

इसके साथ, आपके प्रश्न में अनुमान यह है कि पुनर्मूल्यांकन प्रदर्शन के लिए हमेशा खराब होता है। वास्तव में, अक्सर recompliation अच्छा है।

तो आप इसे कब पुन: संकलित करना चाहते हैं? चलो एक proc का एक उदाहरण देखें जो अंतिम नाम से खोज करता है। संग्रहीत प्रक्रियाएं 'parameter sniffing' करती हैं जो एक आशीर्वाद है (यदि यह आपके लिए काम करती है) और एक अभिशाप (यदि यह आपके खिलाफ काम करता है)। सबसे पहले किसी को jerbrowski के लिए Zebr% पर खोजें। अंतिम नाम सूचकांक यह महसूस करता है कि यह बहुत विशिष्ट है और वापस आ जाएगा, कहें, एक लाख से 3 पंक्तियां - इसलिए एक निष्पादन योजना बनाई गई है। कम पंक्ति परिणाम के लिए संकलित proc के साथ, अगली खोज S% के लिए है। खैर, एस आपका सबसे आम नाम है और 1 मिलियन में से 93,543 पंक्तियों से मेल खाता है।

1

कुछ एसईटी विकल्प संग्रहीत प्रक्रिया पुनर्मूल्यांकन या यहां तक ​​कि एक निष्पादन में कई पुनर्मूल्यांकन का कारण बन सकते हैं!

इनमें से कुछ विकल्प हो सकता है के अंदर भी नहीं सपा

--this will cause recompilation 
SET concat_null_yields_null ON; 
EXEC spMyProc; 

विकल्प है कि अंदर जब सपा रखता कारण से कुछ:

ARITHABORT

ANSI_NULLS

QUOTED_IDENTIFIER

सौभाग्य से, यह ओ ne recompilation का कारण नहीं है: सेट एनओसीटी चालू;

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