परिचय
SQL क्वेरी अपेक्षित परिणाम का वर्णन करती है, परिणाम प्राप्त करने का तरीका नहीं। परिणाम लौटाने के लिए सर्वर द्वारा उठाए जाने वाले विशिष्ट चरणों के समूह को क्वेरी निष्पादन योजना कहा जाता है। योजना अनुकूलक द्वारा बनाई गई है। किसी योजना का चयन निष्पादन की गति को प्रभावित करता है, जो इसे क्वेरी प्रदर्शन समस्या विश्लेषण के सबसे महत्वपूर्ण तत्वों में से एक बनाता है।
निष्पादन योजना में ऑपरेटरों और उनकी संपत्तियां शामिल हैं जो वृक्ष संरचना के रूप में एक दूसरे के साथ जुड़े हुए हैं। प्रत्येक ऑपरेटर एक अलग तार्किक या भौतिक संचालन के लिए जिम्मेदार है। सभी एक साथ, वे क्वेरी टेक्स्ट में वर्णित परिणाम सुनिश्चित करते हैं। ट्री के अंदर, ऑपरेटरों को SQL सर्वर की मेमोरी में क्लास ऑब्जेक्ट्स द्वारा दर्शाया जाता है। सर्वर उपयोगकर्ता (अर्थात, आप और मैं) एक विशिष्ट स्कीमा के साथ XML प्रारूप में उत्पन्न विवरण देखते हैं, जो SQL सर्वर प्रबंधन स्टूडियो (SSMS) वातावरण द्वारा ग्राफिक रूप से प्रदर्शित होता है।
कई विभिन्न योजना ऑपरेटर हैं और इससे भी अधिक संपत्तियां हैं। इसके अलावा, समय-समय पर नए सामने आते हैं। यह लेख सभी संभावित प्रकार के ऑपरेटरों का वर्णन करने की हिम्मत नहीं करता है। इसके बजाय, मैं इस विषय में सबसे दिलचस्प परिवर्धन साझा करना चाहता हूं और कुछ पुराने लेकिन उपयोगी तत्वों को याद दिलाना चाहता हूं।
सर्वर संस्करण
कभी-कभी आप मंचों पर सर्वर संस्करण के लिए अनुरोध पा सकते हैं, भले ही क्वेरी योजना सही प्रारूप (एक्सएमएल) में प्रदान की गई हो। इसके बजाय, आप समय बचा सकते हैं और निष्पादन योजना को XML के रूप में खोल सकते हैं। और योजना का वर्णन करने वाला पहला तत्व आपको बिल्ड प्रॉपर्टी में सर्वर संस्करण दिखाएगा।
यह विधि सर्वर संस्करण के बारे में पूरी जानकारी प्राप्त करने की अनुमति नहीं देती है, लेकिन ज्यादातर मामलों में, यह समझने के लिए पर्याप्त है कि हम क्या करते हैं।
तालिका पंक्तियों की संख्या
दूसरा लगातार प्रश्न है "आपकी तालिका में कितनी पंक्तियाँ हैं?"। यह जानकारी क्वेरी प्लान (सर्वर संस्करण 2008 से) से भी प्राप्त की जा सकती है। इसके लिए, हमें विचाराधीन तालिका के डेटा एक्सेस ऑपरेटर (स्कैन या सीक) का चयन करना होगा और टेबलकार्डिनैलिटी पर एक नज़र डालनी होगी। संपत्ति। एक और दिलचस्प गुण है, अनुमानित पंक्ति आकार, पंक्ति आकार के विनिर्देशन और तालिका या अनुक्रमणिका आकार के अनुमानित मूल्यांकन के लिए (यह देखते हुए कि तालिका संकुचित नहीं है)।
मैं यह नोट करना चाहता हूं कि यह किसी तालिका में पंक्तियों की वास्तविक संख्या नहीं है, बल्कि ऑब्जेक्ट आंकड़ों से डेटा है। हालांकि, यह डेटा क्वेरी बनाते समय ऑप्टिमाइज़र द्वारा लिए गए निर्णयों का आधार है।
संदर्भ
क्वेरी योजना उल्लेखनीय SET सेटिंग्स को सहेजती है जिसके लिए इसे बनाया गया था। सेटिंग्स देखने के लिए, आपको योजना में एक मूल तत्व का चयन करना होगा और सेट विकल्प . का विस्तार करना होगा संपत्ति। उदाहरण के लिए, हम जान सकते हैं कि क्या योजना ARITHABORT . के साथ बनाई गई थी विकल्प सक्षम किया गया है (इस सेटिंग का अंतर अक्सर दो अलग-अलग योजनाओं और स्थितियों को खराब पैरामीटर सूँघने की ओर ले जाता है)।
CPU की संख्या
हम ऑप्टिमाइज़र के लिए उपलब्ध प्रोसेसर की संख्या को पुनः प्राप्त कर सकते हैं। इसके लिए हमें OptimizerHardwareDependentPropertie . को खोलना होगा s -> अनुमानितउपलब्धDegreeOfParallelism एक ही मूल तत्व में पैरामीटर और इसे 2 से गुणा करें। यदि केवल एक प्रोसेसर उपलब्ध है, तो गुणा करने की कोई आवश्यकता नहीं है।
2*2 =4, 4 सीपीयू उपलब्ध हैं। दरअसल, मेरे कंप्यूटर पर 4 कोर प्रोसेसर है, और सभी 4 कोर सर्वर के लिए उपलब्ध हैं। यह जानकारी आपको उस मशीन का पता लगाने में मदद कर सकती है जिस पर योजना बनाई गई थी।
कार्डिनैलिटी अनुमानक संस्करण
SQL सर्वर 2014 से, कार्डिनैलिटी एस्टिमेटर (RU) के कई संस्करण उपलब्ध हो गए हैं। यह तंत्र योजना का चयन करते समय अनुकूलक द्वारा लिए जाने वाले अधिकांश निर्णयों को प्रभावित करता है। आप CardinalityEstimationModelVersion से कार्डिनैलिटी एस्टिमेटर का संस्करण प्राप्त कर सकते हैं रूट ऑपरेटर की संपत्ति।
- 0 - SQL सर्वर <=2012
- 120 - SQL सर्वर 2014
- 130 - SQL सर्वर 2016
- 140 - SQL सर्वर vNext
क्वेरी निष्पादन समय और प्रतीक्षा समय
SQL सर्वर 2016 SP1 की तरह, वास्तविक क्वेरी योजना में निष्पादन समय और प्रोसेसर समय के बारे में जानकारी होती है। इस डेटा को पुनः प्राप्त करने के लिए, आपको QueryTimeStats . का विस्तार करना होगा मूल तत्व में संपत्ति और CpuTime . के मान देखें और बीता हुआ समय . हमें निष्पादन समय के संग्रह को सक्षम करने या "क्वेरी को कितने समय तक निष्पादित किया गया था?" पूछने की आवश्यकता नहीं है। अब और - यह सारी जानकारी योजना में शामिल है।
दूसरा उल्लेखनीय सुधार क्वेरी निष्पादन के दौरान सबसे लंबे समय तक प्रतीक्षा में शीर्ष 10 है। इसके लिए, हमें WaitStats . का विस्तार करना होगा मूल तत्व में गुण। यह जोड़ धीमी क्वेरी निष्पादन के अधिक सटीक कारण प्राप्त करने की अनुमति देता है और निदान को महत्वपूर्ण रूप से सरल करता है।
पैरामीटर प्रकार
पैरामीटर सूची संपत्ति, जो क्वेरी में उपयोग किए गए मापदंडों को सूचीबद्ध करती है, योजना में बहुत पहले मौजूद थी। हालाँकि, SQL Server 2016 SP1 की तरह, पैरामीटर डेटा प्रकार संपत्ति को पैरामीटर परिभाषा में जोड़ा गया है। यह संपत्ति पैरामीटर के डेटा प्रकार को संग्रहीत करती है। यह प्रकार के रूपांतरण के मुद्दों को समझने के लिए उपयोगी हो सकता है।
पढ़ने वाली पंक्तियों की संख्या और पढ़ी जाने वाली पंक्तियों की अनुमानित संख्या
निष्पादन योजना में दो बहुत महत्वपूर्ण गुण शामिल हैं, पंक्तियों की वास्तविक संख्या और पंक्तियों की अनुमानित संख्या। इन गुणों में डेटा रीड ऑपरेटर द्वारा लौटाई गई पंक्तियों की संख्या के बारे में जानकारी होती है, लेकिन वास्तव में पढ़ी गई पंक्तियों की संख्या के बारे में नहीं। पढ़ी गई पंक्तियों की संख्या और पढ़ी जाने वाली पंक्तियों की अनुमानित संख्या इस प्रश्न का उत्तर देती है और उन पंक्तियों की संख्या को पुनः प्राप्त करने की अनुमति देती है जिन्हें सर्वर ने वास्तव में पढ़ा है या पढ़ने जा रहा है। ActualRowsRead (SSMS में पढ़ी गई पंक्तियों की संख्या) गुण SQL Server 2012 SP3, 2014 SP2, 2016 SP1 के रूप में उपलब्ध है। अनुमानित पंक्तियाँपढ़ें (SSMS में पढ़ी जाने वाली पंक्तियों की अनुमानित संख्या) संपत्ति SQL Server 2016 SP1 से उपलब्ध है।
IO सांख्यिकी और ऑपरेटर निष्पादन समय
SQL सर्वर 2016, 2014 SP2 में स्थापित कई बहुत उपयोगी गुण हैं और वास्तविक क्वेरी योजना में उपलब्ध हैं। वे IO मेट्रिक्स हैं (यदि किसी ऑपरेटर के पास IO है) - वास्तविक IO सांख्यिकी, CPU और निष्पादन समय मेट्रिक्स - वास्तविक समय सांख्यिकी, और मेमोरी मेट्रिक्स (2016 SP1 से, यदि किसी ऑपरेटर को मेमोरी की आवश्यकता होती है)।
गुणों में निम्नलिखित नई मीट्रिक शामिल हैं जिन्हें समानांतर योजना के मामले में थ्रेड्स में विभाजित किया जा सकता है:
- वास्तविक बीत चुके हैं
- वास्तविकसीपीयू
- वास्तविक स्कैन
- वास्तविक तार्किक पठन
- वास्तविक भौतिक पठन
- वास्तविक रीडअहेड्स
- वास्तविकLobLogicalReads
- वास्तविक LobPhysicalReads
- वास्तविकLobReadAheads
- इनपुट मेमोरीग्रांट
- आउटपुटमेमोरीग्रांट
- यूज्डमेमोरीग्रांट
जैसा कि आप ऊपर दी गई सूची से देख सकते हैं, आप किसी दिए गए ऑपरेटर, खपत आईओ और मेमोरी के निष्पादन के बारे में व्यापक जानकारी प्राप्त कर सकते हैं। SSMS के पिछले संस्करणों में, इन मीट्रिक्स को प्रॉपर्टीज़ विंडो में दर्शाया जाता है। यदि आप SSMS के पुराने संस्करण का उपयोग करते हैं, तो आप योजना को XML के रूप में खोलकर उन्हें पुनः प्राप्त कर सकते हैं। मेरी राय में, अब अनुमानित लागत से नहीं, बल्कि वास्तविक संसाधनों के द्वारा प्रतिशत दिखाने के लिए सब कुछ है (मैंने कनेक्ट पर एक सुझाव बनाया है। इसलिए, यदि आप विचार पसंद करते हैं, तो कृपया इसे वोट करें)।
सक्षम ट्रेस फ़्लैग के बारे में जानकारी
SQL सर्वर में ट्रेस फ़्लैग डिफ़ॉल्ट सर्वर व्यवहार से कुछ भिन्न व्यवहार के लिए विशेष 'स्विच' होते हैं। SQL सर्वर 2014 SP2 और 2016 SP1 की तरह, सक्षम ट्रेस फ़्लैग के बारे में जानकारी विशिष्ट तत्व के TraceFlags गुण में उपलब्ध है। इसमें क्वेरी निर्माण के समय एक साथ 100 तक सक्षम फ़्लैग शामिल हो सकते हैं।
tempdb में डेटा स्पिल के बारे में जानकारी
कुछ योजना ऑपरेटरों, उदाहरण के लिए, जैसे कि सॉर्ट या हैश मैच, को क्वेरी निष्पादन के दौरान मेमोरी की आवश्यकता होती है। हालाँकि, मेमोरी वॉल्यूम की गणना संकलन के समय की जाती है। विभिन्न कारणों से (जैसे अनुमानित संख्या या पंक्तियों का गलत मूल्यांकन), मेमोरी वॉल्यूम की गणना गलत तरीके से की जा सकती है। यदि निष्पादन के लिए आवश्यक से कम मेमोरी आवंटित की जाती है, तो सर्वर को डेटा को tempdb पर फैलाना होगा। यह क्वेरी निष्पादन को धीमा कर देता है। सर्वर 2012 में ऐसी स्थिति के बारे में सावधानी बरती गई थी, लेकिन SQL Server 2012 SP3, 2014 SP2, 2016 से, नैदानिक जानकारी का विस्तार किया गया है, और अब इसमें स्पिल्ड डेटा और रीड डेटा की मात्रा शामिल है। तो, आप समस्या का मूल्यांकन कर सकते हैं और उचित उपाय कर सकते हैं।
निष्कर्ष
निष्पादन योजना में बहुत सारी उपयोगी जानकारी शामिल है, वास्तविक क्वेरी योजना में अभी और जानकारी शामिल है, और SQL सर्वर के अंतिम संस्करणों में वास्तविक क्वेरी योजना केवल उपयोगी जानकारी की खान है। यह लेख किसी को क्वेरी योजनाओं का विश्लेषण करने के लिए सिखाने के लिए नहीं है। इसके बजाय, मैंने सबसे दिलचस्प योजना गुणों पर विचार किया, जिसमें नई संपत्तियां और पुरानी, लेकिन कम आंकी गई संपत्तियां शामिल हैं। मुझे उम्मीद है कि अगली बार जब आपको क्वेरी के प्रदर्शन का विश्लेषण करने की आवश्यकता होगी तो यह लेख आपकी मदद करेगा।
लेख का अनुवाद लेखक की अनुमति से Codingsight टीम द्वारा किया गया था।
उपयोगी टूल:
SQL सर्वर के लिए dbForge क्वेरी बिल्डर - उपयोगकर्ताओं को मैन्युअल कोड लेखन के बिना सहज ज्ञान युक्त दृश्य इंटरफ़ेस के माध्यम से त्वरित और आसानी से जटिल SQL क्वेरी बनाने की अनुमति देता है।