प्रिय [आपका नाम यहाँ]!
अरे नहीं, मुझे यह सुनकर दुख हुआ! आइए कुछ बुनियादी बातों के साथ शुरू करें, ताकि आप एक पल में तय कर सकें।
जिस चीज़ में आप चल रहे हैं, उसे 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
बनाम स्कैन, इंडेक्स विखंडन, या किसी भी कार्गो पंथ-वाई सामान लोगों को हेम और हवलदार के बारे में जानने के लिए तैयार न करें।
आमतौर पर, एक बहुत ही बुनियादी अनुक्रमण समस्या है। कभी-कभी कोड को थोड़ा पुनर्लेखन की आवश्यकता होती है।
यदि आप पैरामीटर सूँघने के बारे में अधिक जानना चाहते हैं:
यदि आप इसे पढ़ रहे हैं, और आपको लगता है कि मैंने एक लिंक या सहायक उपकरण को याद किया, तो एक टिप्पणी छोड़ दें। मैं इसे बनाए रखने की पूरी कोशिश करूंगा।