संग्रहीत कार्यविधियों के लिए निष्पादन योजनाएँ अनुपलब्ध हैं


12

संग्रहीत कार्यविधियों के लिए कैश से गायब होने की योजना के कारण क्या हैं?

  1. WITH RECOMPILE
  2. गतिशील एसक्यूएल
  3. एन्क्रिप्ट किया गया कोड
  4. महत्वपूर्ण डेटा परिवर्तन
  5. अद्यतन आँकड़े
  6. और क्या?

मैंने 2 सर्वर (SQL Server 2008 R2 और SQL Server 2012) पर काम किया है, हाल ही में बहुत संसाधन-गहन संग्रहीत प्रक्रियाओं के लिए कैश में योजना नहीं थी। कई, शायद सभी, संग्रहीत प्रक्रियाओं के अंदर बयानों की भी योजना कैश में नहीं थी। संग्रहीत प्रक्रियाओं में से कुछ बहुत बार निष्पादित होते हैं जैसे प्रति सेकंड कुछ समय।

कोई स्मृति दबाव जो भी हो। सर्वर में से एक में जरूरत से ज्यादा हार्डवेयर है।

मुझे लगा कि लापता योजनाएं संग्रहीत प्रक्रियाओं के बीच में अस्थायी टेबल क्रिएशन के कारण थीं, लेकिन यह SQL Server 2000 या उससे पहले की पुरानी जानकारी प्रतीत होती है। SQL सर्वर 2005 के साथ शुरू, recompiles DDL के बाद बयानों के लिए बयान स्तर पर होता है। क्या यह सभी मामलों में सही है या यह अभी भी नए संस्करणों पर हो सकता है?

लापता योजनाओं के लिए और क्या हो सकता है? मैंने इस विषय पर कुछ लेखों को स्किम किया है, लेकिन कुछ भी उचित नहीं लगता है।

इस सप्ताह मैं जिस सर्वर को देख रहा हूं, उस पर एडहॉक वर्कलोड का अनुकूलन सक्षम है। संग्रहीत प्रक्रियाओं में से एक को दिन में केवल एक बार निष्पादित किया जाता है। मेरे पास उस के लिए कोड है। मेरे पास उस कोड के लिए कोड नहीं है जो प्रति मिनट 100 से अधिक बार निष्पादित हो रहा है, लेकिन मैं इसे प्राप्त कर सकता हूं। मैं कोड पोस्ट नहीं कर पाऊंगा, लेकिन मैं अपने प्रश्न के संबंध में इसका वर्णन कर सकता हूं।

मुझे विश्वास नहीं है कि कोई भी प्रक्रिया कैश को मुक्त कर रहा है या स्वच्छ बफ़र्स को छोड़ रहा है। यह क्लाइंट Solarwinds DPA को उनके निगरानी उपकरणों में से एक के रूप में उपयोग कर रहा है। डीपीए ने संग्रहित खरीद में कथन के लिए निष्पादन योजनाओं में से एक पर कब्जा कर लिया, जिसे दिन में एक बार कहा जाता है। उस बयान में भारी मात्रा में WHEREखंड न होने के कारण भारी मात्रा में रीड्स हैं । यदि डीपीए ने बयान पर कब्जा कर लिया है, तो यह एक अनुमानित योजना है और एक समय में योजना कैश में थी। बस तब नहीं है जब हम समस्या निवारण कर रहे हैं। मैं उन्हें sp_WhoIsActiveएक मेज के लिए प्रवेश शुरू कर देंगे ।

मैं उपयोग कर रहा हूं sp_BlitzCache। (मैं ब्रेंट ओजर अनलिमिटेड के लिए काम करता हूं) यह संपूर्ण संग्रहीत कार्यविधि के साथ-साथ व्यक्तिगत विवरणों की योजनाओं के मौजूद होने पर योजना को दिखाएगा। यदि वे मौजूद नहीं हैं, तो यह एक चेतावनी के लिए है "हमें इस क्वेरी के लिए कोई योजना नहीं मिल सकती है। इसके लिए संभावित कारणों में गतिशील SQL, RECOMPILEसंकेत और एन्क्रिप्टेड कोड शामिल हैं।" और वह चेतावनी बयानों पर भी है।

TF 2371 जगह में नहीं है। मैं प्रतीक्षा आँकड़े देख रहा हूँ। सर्वर बहुत ऊब है। PLE 130,000 से अधिक है।

अब मेरे पास 2 और संग्रहीत प्रक्रियाओं के लिए कोड है। उनमें से एक गतिशील एसक्यूएल का उपयोग कर रहा है exec (@sql)ताकि हम यह जान सकें कि इसके लिए कोई योजना क्यों नहीं है। लेकिन अन्य एक, और यह वह है जो प्रति मिनट 100 से अधिक बार चल रहा है, सामान्य से बाहर कुछ भी नहीं है। केवल एक चीज जो इसमें है, वह यह है कि कोड के 1000 से अधिक लाइनों के बीच में अस्थायी टेबल बनाए जा रहे हैं। यह बच्चे को संग्रहीत प्रक्रियाओं का एक गुच्छा भी कहता है।

SQL Server 2008 में प्लान कैशिंग के बारे में , मैं किसी भी शाब्दिक> = 8k को नहीं देख रहा हूं, लेकिन संग्रहीत प्रक्रियाओं में से एक में किसी अन्य संग्रहीत कार्यविधि को कॉल करने से ठीक पहले एक बल्क सम्मिलित के बारे में टिप्पणी है। लेकिन बल्क इंसर्ट बाहरी संग्रहित प्रक्रिया में दिखाई नहीं देता है जिसे मैं देख रहा हूं। लेख का "पुनरावर्तन थ्रेशोल्ड" खंड दिलचस्प है। अस्थायी टेबलों के लिए मैं जो कुछ भी देख रहा हूं वह INSERTs (जो लाखों पंक्तियों के परिणामस्वरूप हो सकता है), कुछ अपडेट और डिलीट। बहुत सारे डेटा अस्थायी तालिकाओं में बदल जाते हैं। लाखों।


जैसा कि आपके पास संग्रहित procs है जो इस समस्या को दूर करता है तो आप एक न्यूनतम उदाहरण बना सकते हैं जो इसे repros करता है और ऐसा करने में समस्या का पता लगाता है?
मार्टिन स्मिथ

जवाबों:


3

दो प्लान कैश DMF हैं:

sysinos_exec_query_plan - XML ​​प्रारूप में कैश की गई योजनाएँ लौटाता है, लेकिन केवल एक निश्चित आकार तक (और केवल तब तक जब तक कि उन्हें SQL सर्वर में XML के रूप में स्वरूपित नहीं किया जा सकता है, जिसका अर्थ है नेस्टेड स्तर तक 128)।

sysinos_exec_text_query_plan - पाठ स्वरूप में किसी भी आकार की कैश्ड योजना देता है। लेकिन दोष यह है कि जब योजनाएं बड़ी होती हैं, तो आप उन्हें SQL सर्वर के अंदर XML में परिवर्तित नहीं कर सकते हैं, और यहां तक ​​कि TRY_CONVERT के रूप में XML एक शून्य देता है।

sp_BlitzCache केवल पूर्व DMV को हिट करता है (क्योंकि इसमें सभी प्रकार के स्लाइस और डीसिंग करने के लिए XML के रूप में क्वेरी योजनाओं का विश्लेषण करने की आवश्यकता है। मैंने इसे बेहतर बनाने के लिए # 838 पर Github को मुद्दा बनाया है ताकि हम कम से कम सतर्क उपयोगकर्ताओं को उनके पते के लिए lysinos_exec_text_query_plan पर जा सकें। बड़े सवाल। हम अभी भी उस पर XML विश्लेषण नहीं कर पाएंगे, हालांकि।


और यह भी एक ही कारण sys.query_store_plan.query_planहै nvarchar(MAX), XML (SQL सामान्य ज्ञान) नहीं।
रेमस रूसु

@RemusRusanu ooo, इतनी बड़ी योजनाएँ वहाँ दिखाई देती हैं! अच्छा लगा।
ब्रेंट ओजर

हम जाँच कर रहे हैं कि क्या लापता योजनाएँ आपके पाए जाने के कारण हैं। जैसे ही मैं वापस सुनता हूं, मैं एक अपडेट पोस्ट करूंगा।
तारा किसर

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

@TaraKizer आप केवल इसलिए कर रहे हैं क्योंकि आपकी तिमाही समीक्षा सही आ रही है? आपने वहां क्या किया वह मैने देखा। बोनस अनलॉक किया गया।
ब्रेंट ओजर

0

संभवतः आपको XML के अधिकतम आकार को समायोजित करने की आवश्यकता है जिसे SSMS द्वारा ग्रिड में वापस किया जा सकता है?


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