कल की तुलना में मेरी क्वेरी अचानक धीमी क्यों है?


76

[अभिवादन]

(जांचें)

[ ] Well trained professional, [ ] Casual reader, [ ] Hapless wanderer,

मेरे पास एक (सभी लागू करने की जाँच करें)

[ ] query [ ] stored procedure [ ] database thing maybe  

यह ठीक चल रहा था (यदि लागू हो)

[ ] yesterday [ ] in recent memory [ ] at some point 

लेकिन अब धीरे है।

मैंने पहले ही यह सुनिश्चित करने के लिए जाँच कर ली है कि इसे अवरुद्ध नहीं किया जा रहा है, और यह लंबे समय से चल रहे रखरखाव कार्य, रिपोर्ट या अन्य बैंड प्रक्रिया से बाहर का शिकार नहीं है।

समस्या क्या है, मुझे क्या करना चाहिए और कुछ सहायता प्राप्त करने के लिए मैं क्या जानकारी प्रदान कर सकता हूं?

[*Insert appropriate closing remarks*]

जवाबों:


88

प्रिय [आपका नाम यहाँ]!

अरे नहीं, मुझे यह सुनकर दुख हुआ! आइए कुछ बुनियादी बातों के साथ शुरू करें, ताकि आप एक पल में तय कर सकें।

जिस चीज़ में आप चल रहे हैं, उसे Parameter Sniffing कहा जाता है

यह एक तरह से अजीब अजीब समस्या है। नाम ठीक जीभ से लुढ़कता है। गिलहरी के लिए जर्मन शब्द की तरह।

और यह आमतौर पर आपका दोस्त है।

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

इस ख़राब तस्वीर को देखने का सबसे आसान तरीका एक संग्रहित प्रक्रिया की कल्पना करना है, जिसमें दो लोप किए गए आबादी से चीजों को गिनने की आवश्यकता होती है।

उदाहरण के लिए:

  • क्रॉसफ़िट शर्ट पहनने वाले लोग जो घायल नहीं हैं: शून्य

  • क्रॉसफ़िट शर्ट पहनने वाले लोग जो जब जीतते हैं तो जीतते हैं: सभी

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

मैं किसके खिलाफ हूं?

यह वास्तव में एक कठिन समस्या का पता लगाना, परीक्षण करना और ठीक करना है।

  • यह खोजना मुश्किल है क्योंकि यह लगातार नहीं होता है
  • यह परीक्षण करना कठिन है क्योंकि आपको यह जानना होगा कि किन मापदंडों के कारण विभिन्न योजनाएं हैं
  • इसे ठीक करना कठिन है क्योंकि कभी-कभी इसे क्वेरी और इंडेक्स ट्यूनिंग की आवश्यकता होती है
  • इसे ठीक करना कठिन है क्योंकि आप प्रश्न या इंडेक्स बदलने में सक्षम नहीं हो सकते हैं
  • इसे ठीक करना मुश्किल है क्योंकि यदि आप प्रश्न या इंडेक्स बदलते हैं, तो भी यह वापस आ सकता है

जल्दी सुधार

कभी-कभी, आपको केवल स्पष्टता की आवश्यकता होती है। या बल्कि, आपकी योजना कैश करती है।

यदि यह एक संग्रहीत प्रक्रिया है

दौड़ने की कोशिश करो EXEC sys.sp_recompile @objname = N'schema.procname'। अगली बार जब यह एक नई योजना को फिर से शुरू करने की प्रक्रिया का कारण होगा।

यह क्या ठीक नहीं होगा:

  • वर्तमान में प्रक्रियाएं इसे चला रही हैं।

इसकी क्या गारंटी है:

  • अगली प्रक्रिया जो recompiling के बाद चलती है वह एक पैरामीटर का उपयोग करेगी जो आपको एक अच्छी योजना प्रदान करती है।

आप sp_recompileकिसी तालिका या दृश्य को भी इंगित कर सकते हैं , लेकिन यह पूर्वाभास किया जाना चाहिए कि उस तालिका या दृश्य को छूने वाले सभी कोड फिर से मिलेंगे। यह समस्या को पूरी तरह से कठिन बना सकता है।

यदि यह एक पैरामीटर क्वेरी है

आपका काम थोड़ा और मुश्किल है। आपको एसक्यूएल हैंडल को ट्रैक करना होगा। आप पूरी योजना कैश से मुक्त नहीं करना चाहते हैं - जैसे sp_recompileकिसी तालिका या दृश्य के विरुद्ध उपयोग करने पर, आप अनपेक्षित परिणामों का एक पूरा गुच्छा ट्रिगर (हा हा हा) कर सकते हैं।

यह पता लगाने का सबसे आसान तरीका है कि sp_BlitzWho * चलाएं ! एक कॉलम है जिसे "फिक्स पैरामीटर सूँघने" कहा जाता है जिसमें कैश से किसी एक योजना को हटाने की आज्ञा है। हालांकि, यह recompile के समान कमियां हैं।

यह क्या ठीक नहीं होगा:

  • वर्तमान में प्रक्रियाएं इसे चला रही हैं।

इसकी क्या गारंटी है:

  • अगली प्रक्रिया जो recompiling के बाद चलती है वह एक पैरामीटर का उपयोग करेगी जो आपको एक अच्छी योजना प्रदान करती है।

मुझे अभी भी मदद की ज़रूरत है!

हमें निम्नलिखित चीजों की आवश्यकता है:

  • यदि संभव हो तो अच्छी क्वेरी योजना
  • खराब क्वेरी योजना
  • मापदंडों का इस्तेमाल किया
  • प्रश्न में प्रश्न
  • तालिका और सूचकांक परिभाषाएँ

क्वेरी प्लान और क्वेरी प्राप्त करना

यदि क्वेरी चल रही है, तो आप वर्तमान में क्वेरी को निष्पादित करने के लिए sp_BlitzWho * या sp_WhoIsActive का उपयोग कर सकते हैं ।

EXEC sp_BlitzWho;

EXEC sp_WhoIsActive @get_plans = 1;

पागल

यदि क्वेरी वर्तमान में निष्पादित नहीं हो रही है, तो आप sp_BlitzCache * का उपयोग करके योजना कैश में इसके लिए जांच कर सकते हैं ।

यदि आप SQL सर्वर 2016+ पर हैं, और Query Store चालू है, तो आप sp_BlitzQueryStore * का उपयोग कर सकते हैं ।

EXEC dbo.sp_BlitzCache @StoredProcName = 'Your Mom';

EXEC dbo.sp_BlitzQueryStore @StoredProcName = 'Your Mom';

ये आपको अपने संग्रहीत प्रक्रिया के कैश्ड संस्करण को ट्रैक करने में मदद करेंगे। यदि यह केवल पैरामीटर कोड है, तो आपकी खोज थोड़ी अधिक कठिन है। हालांकि, यह मदद कर सकता है:

EXEC dbo.sp_BlitzCache @QueryFilter = 'statement';

आपको उनमें से किसी से भी समान आउटपुट देखना चाहिए। फिर, शांत नीले क्लिक करने वाले कॉलम को आमंत्रित करने की क्वेरी योजना आपका मित्र है।

पागल

योजनाओं को साझा करने का सबसे आसान तरीका पेस्ट द प्लान * का उपयोग करना है , या एक्सएमएल को पास्टबिन में डंप करना है। इसे प्राप्त करने के लिए, नीले क्लिक करने वाले स्तंभों को आमंत्रित करने वालों में से किसी एक पर क्लिक करें। आपकी क्वेरी योजना एक नए SSMS टैब में दिखाई देनी चाहिए।

पागल

यदि आप अपनी कंपनी के कोड और क्वेरी को साझा करने के बारे में स्पर्श करते हैं, तो आप अपनी योजना का पता लगाने के लिए संतरी वन के मुफ्त प्लान एक्सप्लोरर टूल का उपयोग कर सकते हैं । ध्यान रखें, इससे मदद करना कठिन हो जाता है - अज्ञात कोड पढ़ने और जानने के लिए बहुत कठिन है।

इन सभी टूल के बारे में हमने चर्चा की है कि प्रश्न पाठ को वापस करना चाहिए। आपको यहां कुछ और करने की जरूरत नहीं है।

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

पागल

यदि आप sp_BlitzCache * का उपयोग कर रहे हैं , तो एक क्लिक करने योग्य कॉलम है जो आपको संग्रहीत प्रक्रियाओं के लिए निष्पादन विवरण देता है।

पागल

तालिका और सूचकांक की परिभाषा प्राप्त करना

आप आसानी से SSMS को स्क्रिप्ट की चीजों से राइट क्लिक कर सकते हैं।

पागल

यदि आप एक शॉट में सब कुछ प्राप्त करना चाहते हैं, तो sp_BlitzIndex * मदद कर सकता है यदि आप इसे एक टेबल पर सीधे इंगित करते हैं।

EXEC dbo.sp_BlitzIndex @DatabaseName = 'StackOverflow2010',
                       @SchemaName = 'dbo',
                       @TableName = 'Users';

यह आपको टेबल की परिभाषा देगा (हालांकि एक स्टेटमेंट के रूप में नहीं), और अपने सभी इंडेक्स के लिए स्टेटमेंट बनाएं।

अपने प्रश्न में इस जानकारी को एकत्रित करना और जोड़ना, लोगों को आपकी मदद करने के लिए या आपको सही दिशा में इंगित करने के लिए पर्याप्त जानकारी मिलनी चाहिए।

मैं इसे खुद करना चाहता हूँ!

अच्छा, मस्त। मैं तुम्हारे लिए खुश हूँ। आप पागल व्यक्ति

ऐसे कई तरीके हैं जिनसे लोगों को लगता है कि वे "सूंघ" पैरामीटर सूँघ रहे हैं:

लेकिन ये वास्तव में अलग-अलग तरीकों से सूँघने वाले पैरामीटर को निष्क्रिय कर देते हैं। यह कहना नहीं है कि वे समस्या को हल नहीं कर सकते हैं, वे वास्तव में मूल कारण से नहीं मिलते हैं।

ऐसा इसलिए है क्योंकि मूल कारण तक पहुंचना आमतौर पर कठिन होता है। आपको उन pesky "योजना गुणवत्ता मुद्दों" की तलाश करनी होगी।

तेज़ बनाम धीमी योजनाओं के साथ शुरू, अंतर की तरह देखें:

  • इंडेक्स का इस्तेमाल किया
  • आदेश में शामिल हों
  • सीरियल बनाम समानांतर

अलग-अलग ऑपरेटरों के लिए भी देखें जो आपके कोड को सूँघने के प्रति संवेदनशील बनाते हैं:

  • लुकअप
  • प्रकार
  • प्रकार से जुड़ें
  • मेमोरी अनुदान (और विस्तार द्वारा, फैल)
  • spools

बनाम स्कैन, इंडेक्स विखंडन, या किसी भी कार्गो पंथ-वाई सामान लोगों को हेम और हवलदार के बारे में जानने के लिए तैयार न करें।

आमतौर पर, एक बहुत ही बुनियादी अनुक्रमण समस्या है। कभी-कभी कोड को थोड़ा पुनर्लेखन की आवश्यकता होती है।

यदि आप पैरामीटर सूँघने के बारे में अधिक जानना चाहते हैं:

यदि आप इसे पढ़ रहे हैं, और आपको लगता है कि मैंने एक लिंक या सहायक उपकरण को याद किया, तो एक टिप्पणी छोड़ दें। मैं इसे बनाए रखने की पूरी कोशिश करूंगा।



28

पैरामीटर सूँघना क्वेरी के अलग-अलग प्रदर्शन का एकमात्र संभावित कारण नहीं है। निम्नलिखित सामान्य कारणों में से कोई भी समान लक्षण दिखा सकता है:

  1. डेटा वितरण / मात्रा परिवर्तित, एक अनुकूलक खोज ट्री निर्णय टिपिंग बिंदु को पार करते हुए
  2. सूचकांक / फाइलें खंडित हो गईं
  3. आंकड़े अपडेट / जोड़ / गिराए गए हैं या डेटा परिवर्तन के कारण बासी और भ्रामक हो गए हैं
  4. विंडोज मेमोरी उपयोग बदल गया
  5. लेन-देन लॉग पूर्ण हैं और ट्रंकिंग नहीं है, जिससे बार-बार भौतिक फ़ाइल विस्तार होता है
  6. स्कीमा परिवर्तित - सूचकांक / अनुक्रमित दृश्य / स्तंभ / बाधा जोड़ा, संशोधित या गिरा, डेटा प्रकार बदल गया, आदि।
  7. ट्रेस ध्वज सेटिंग्स बदल गईं
  8. Windows अद्यतन लागू किया गया था
  9. डेटाबेस या सर्वर सेटिंग बदल गई
  10. सर्वर घन स्तर बदल गया
  11. क्लाइंट एप्लिकेशन सत्र सेटिंग्स बदल गईं

इस सूची में आइटम 6 - 11 कुछ स्पष्ट कार्रवाई किए जाने के बाद ही हो सकता है। मुझे लगता है कि आप उन लोगों को बाहर करने के लिए थे, लेकिन कई बार जो चुनौती का सामना कर रहा है, उसे पता नहीं है कि किसी और ने बदलाव किया है, और इससे पहले कि आप चेक कैश एंट्री क्लीयर करने की राह पर चलें।


1
पॉल को संपादित करने के लिए धन्यवाद। @sp_BlitzErik - विशिष्ट विषयों पर सलाह प्रदान करना मेरा उद्देश्य नहीं था, बस जागरूकता बढ़ाने के लिए कि वे मौजूद हैं, और बाहर की जाँच के लायक हो सकता है। यह किसी भी तरह से आपके महान पद से कम होने का नहीं है। आप पेशेवर, और अच्छे हास्य के साथ गहराई से सूँघने वाले पैरामीटर को निपटाते हैं। मुझे इसे पढ़कर बहुत अच्छा लगा। मैं केवल यह सुनिश्चित करना चाहता हूं कि यदि कोई व्यक्ति इस पद पर जाता है, तो आकर्षक शीर्षक के बाद, उसे वैकल्पिक संभावित कारणों से अवगत कराया जाता है। IMHO यह आपके पोस्ट के लिए मूल्य जोड़ता है, लेकिन अगर आप अभी भी मुझे इसे हटाना चाहते हैं, तो मुझे बताएं।
SQLRaptor

नहीं, बिलकुल नहीं। मैं कभी किसी से ऐसा जवाब नहीं मांगता जो गलत या हानिकारक न हो। मुझे अभी भी लगता है कि आप कुछ विवरण जोड़ सकते हैं, लेकिन यह अंततः आपके ऊपर है।
एरिक डार्लिंग

10

केवल उन मामलों में मौजूदा उत्तरों को जोड़ने के लिए जिनकी वे मदद नहीं करते हैं, जब "अचानक" आपके प्रश्न अगले दिन अलग तरह से व्यवहार करते हैं, तो जांच करें:

  • क्या पिछली बार से इस्तेमाल की गई टेबल के लिए योजना बदल गई है? SSMS के मामले में, आप सर्वर को ऑब्जेक्ट एक्सप्लोरर में राइट-क्लिक कर सकते हैं और चुन सकते हैं Reports → Standard Reports → Schema Changes History
  • क्या आइटम की गिनती नाटकीय रूप से बढ़ी? हो सकता है कि आपकी क्वेरी बस इतनी धीमी हो जब उपयोग की गई तालिकाओं में बहुत अधिक डेटा हो।
  • क्या आप के रूप में उसी समय कोई और डेटाबेस का उपयोग कर रहा है? हो सकता है कि समय स्लॉट उठाएं जहां आप एक-दूसरे के काम में हस्तक्षेप नहीं करते हैं।
  • सिस्टम आँकड़े कैसे देख रहे हैं? हो सकता है कि सर्वर गर्म चल रहा है और सीपीयू को थ्रॉटल कर रहा है या हार्ड ड्राइव अंतरिक्ष या स्वैप से बाहर चल रहे हैं। हो सकता है कि सर्वर रूम में आग या बाढ़ जैसी कोई अन्य हार्डवेयर समस्या हो।

7

एक और संभावना यह है कि आपकी Infrastructure Team VMware पर vMotion जैसे उपकरणों का उपयोग कर रही है और VM जो आपके SQL उदाहरण का समर्थन करता है, को बिना DBA के होस्ट से होस्ट के लिए मूल रूप से स्थानांतरित किया जा रहा है।

यह एक वास्तविक समस्या है जब आपका इन्फ्रास्ट्रक्चर आउट-सोर्सेड है ... मैं इसके साथ एक वास्तविक बुरा सपना देख रहा हूं।

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