संग्रहीत कार्यविधियों के लिए कैश से गायब होने की योजना के कारण क्या हैं?
WITH RECOMPILE
- गतिशील एसक्यूएल
- एन्क्रिप्ट किया गया कोड
- महत्वपूर्ण डेटा परिवर्तन
- अद्यतन आँकड़े
- और क्या?
मैंने 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 (जो लाखों पंक्तियों के परिणामस्वरूप हो सकता है), कुछ अपडेट और डिलीट। बहुत सारे डेटा अस्थायी तालिकाओं में बदल जाते हैं। लाखों।