अनुकूलन: परिवर्तनशील घोषणाओं को अपनी प्रक्रिया के शीर्ष पर ले जाना


15

कुछ संग्रहीत प्रक्रियाओं के अनुकूलन पर काम करते समय, मैं डीबीए के साथ बैठ गया और उच्च अवरुद्ध और / या उच्च पढ़ने या लिखने की गतिविधि के साथ कुछ संग्रहीत प्रक्रियाओं से गुज़रा।

एक बात डीबीए का उल्लेख किया गया था कि मुझे TABLErecompiles से बचने के लिए संग्रहीत प्रक्रिया के शीर्ष पर सभी चर (विशेष रूप से) घोषित करना चाहिए ।

यह पहला है जो मैंने इसके बारे में सुना है और हमारे पास सभी अलग-अलग संग्रहीत प्रक्रियाओं को फिर से शुरू करने से पहले कुछ पुष्टि की तलाश में था। वह इसे "कोड के देर से देखने" को बुला रहा था, और recompile स्कीमा को लॉक कर रहा था जो ब्लॉकिंग के लिए जिम्मेदार होगा।

क्या आपके द्वारा संग्रहीत प्रक्रिया के शीर्ष पर सभी चर घोषणाओं को स्थानांतरित करने से recompiles कम हो जाते हैं?

जवाबों:


18

नहीं।

यह या तो एक लंबे समय से पहले सच था (और अब नहीं है, कम से कम एसक्यूएल सर्वर 2000 के बाद से), या यह कभी भी सच नहीं था और आपका डीबीए सिर्फ निम्नलिखित के साथ उसकी सिफारिश को भ्रमित करता है :

संग्रहीत कार्यविधि की शुरुआत में अस्थायी तालिकाओं के लिए सभी डीडीएल बयानों (जैसे इंडेक्स बनाने) को एक साथ समूहित करना महत्वपूर्ण है। इन DDL कथनों को एक साथ रखकर स्कीमा परिवर्तन के कारण होने वाले अनावश्यक संकलन से बचा जा सकता है।

आप इस पृष्ठ पर इस अनुशंसा के पीछे तर्क का एक और स्पष्टीकरण पा सकते हैं ।

यदि हम इस Microsoft KB पर एक नज़र डालें , तो हम देखते हैं कि संग्रहीत प्रक्रिया का कारण recompile निम्नलिखित में से एक हो सकता है (SQL Server 2005+):

  1. स्कीम्स बदल गए।
  2. आंकड़े बदल गए।
  3. पुनः संयोजक DNR।
  4. सेट का विकल्प बदल गया।
  5. टेम्प टेबल बदली।
  6. रिमोट की पंक्तियाँ बदलीं।
  7. ब्राउज़ के लिए परमिट बदल गए।
  8. क्वेरी अधिसूचना वातावरण बदल गया।
  9. MPI दृश्य बदला
  10. कर्सर विकल्प बदल गए।
  11. Recompile विकल्प के साथ।

एक चर की घोषणा - यहां तक ​​कि एक तालिका चर (यानी @table_variable) - इनमें से किसी भी घटना को ट्रिगर नहीं किया जा सकता है, जाहिर है, क्योंकि एक चर घोषित करने से डीडीएल की गिनती नहीं होती है । एक चर (यहां तक ​​कि एक तालिका चर) एक अस्थायी वस्तु है जो आपके टी-एसक्यूएल प्रोग्रामिंग के लिए विशेष रूप से उपयोग की जाती है। यही कारण है कि टेबल चर को कोई आँकड़े नहीं मिलते हैं और वे लेनदेन से बाध्य नहीं होते हैं । एक चर (तालिका या नहीं) की घोषणा एक खरीद recompile ट्रिगर नहीं कर सकते।

एक अस्थायी तालिका (यानी बनाना #temp_table) या एक सूचकांक है, तथापि, है DDL डेटाबेस के भौतिक परिभाषा प्रभावित करता है। टेंप टेबल और इंडेक्स सांख्यिकी और ट्रांजेक्शनल कंट्रोल के साथ "वास्तविक" ऑब्जेक्ट हैं, इसलिए उन्हें बनाने से ऊपर की सूची में किसी भी घटना 1, 2 या 5 में आग लग सकती है और इस तरह एक खरीद recompile को ट्रिगर किया जा सकता है।


3

यह एक अंतर नहीं करना चाहिए या संकलन ताले को कम करना चाहिए या स्टैक के नीचे या शीर्ष पर एक चर आधे रास्ते की घोषणा करने के लिए कम recompilations का कारण बनना चाहिए। मैं पठनीयता के लिए शीर्ष पर ऐसा करने के लिए अधिक से अधिक बार नहीं होता।

प्रश्न का हिस्सा "मेरी डीबीए सोच क्या है" पर जाने के लिए, केवल एक चीज जो मैं (निक के बिंदु के अलावा) कर सकता हूं कि वे सोच रहे हैं कि कुछ कैसे हुआ करता था) शायद वे पैरामीटर सूंघने के बारे में बात कर रहे थे (देखें सरल बात पर इस लिंक पर विकल्प 2 )

आपके ब्लॉकिंग के बारे में -> यदि आप सही ब्लॉकिंग देख रहे हैं, तो वह संकलन लॉक विवाद का प्रकार नहीं है जो आपका DBA सबसे अधिक संभावना के बारे में बात कर रहा है। हालांकि यह सच है कि कुछ चीजें ऐसी होती हैं जो इसे प्रभावित करती हैं (स्कीमा क्वालिफाइंग टेबल नहीं, स्कीमा क्वालिफाइड योर स्टोरेज प्रोसेस कॉल्स, मसलन) यह आपके उच्च रीड्स का कारण नहीं है और निश्चित रूप से आपके ब्लॉक होने का कारण नहीं है। आपको इन संकलित तालों से बचने के लिए निश्चित रूप से सभी करना चाहिए। लेकिन मैं बाकी संग्रहीत कार्यविधि कोड को ट्यूनिंग और अनुकूलन के रूप में देखूंगा जहां चर हैं, इस बारे में चिंता करने की तुलना में अधिक महत्वपूर्ण कार्य है। यदि आप सत्यापित करना चाहते हैं कि आप यहां के मुद्दों का अनुभव नहीं कर रहे हैं, तो आप संकलित तालों को कैसे पहचानें और हल करें, यह भी पढ़ सकते हैं।

उदाहरण के पहले / बाद में पोस्ट करें और हम देखेंगे कि डीबीए यहां क्या चला रहा है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.