Database
 sql >> डेटाबेस >  >> RDS >> Database

सरल मानकीकरण और तुच्छ योजनाएँ — भाग 3

निष्पादन योजनाएं

यदि SQL कथन सरल पैरामीटरकरण का उपयोग करता है, तो निष्पादन योजनाओं में प्रदान की गई जानकारी से यह बताने की अपेक्षा आप अपेक्षा से अधिक जटिल हो सकते हैं . यह कोई आश्चर्य की बात नहीं है कि अत्यधिक अनुभवी SQL सर्वर उपयोगकर्ताओं को भी यह गलत लगता है, क्योंकि हमें अक्सर विरोधाभासी जानकारी प्रदान की जाती है।

आइए SQL सर्वर 2019 CU 14 पर स्टैक ओवरफ़्लो 2010 डेटाबेस का उपयोग करते हुए कुछ उदाहरण देखें, जिसमें डेटाबेस संगतता 150 पर सेट है।

शुरू करने के लिए, हमें एक नई गैर-संकुल अनुक्रमणिका की आवश्यकता होगी:

क्रिएट इंडेक्स [IX dbo.Users Reputation (DisplayName)] ऑन dbo.Users (प्रतिष्ठा) INCLUDE (DisplayName);

1. सरल पैरामीटरीकरण लागू

यह पहली उदाहरण क्वेरी सरल पैरामीटरकरण . का उपयोग करती है :

 dbo से U.DisplayName चुनें। यूज़र्स यू जहां यू.प्रतिष्ठा =999;

अनुमानित (पूर्व-निष्पादन) योजना में निम्नलिखित पैरामीटर-संबंधी तत्व हैं:

अनुमानित योजना मानकीकरण गुण

ध्यान दें @1 शीर्ष पर दिखाए गए क्वेरी टेक्स्ट को छोड़कर पैरामीटर हर जगह पेश किया जाता है।

वास्तविक (निष्पादन के बाद) योजना है:

वास्तविक योजना मानकीकरण गुण

ध्यान दें कि गुण विंडो ने अब ParameterizedText खो दिया है तत्व, पैरामीटर रनटाइम मान के बारे में जानकारी प्राप्त करते समय। पैरामीटरयुक्त क्वेरी टेक्स्ट अब विंडो के शीर्ष पर '@1 . के साथ दिखाया गया है '999' के बजाय।

2. सरल पैरामीटरीकरण लागू नहीं किया गया

यह दूसरा उदाहरण नहीं . करता है सरल मानकीकरण का उपयोग करें:

-- एक अतिरिक्त कॉलम प्रोजेक्ट करना U.DisplayName, U.CreationDate का चयन करें -- NEWFROM dbo.Users AS U WHERE U.Reputation =999;

अनुमानित योजना से पता चलता है:

अनुमानित गैर-पैरामीटरयुक्त योजना

इस बार, पैरामीटर @1 सूचकांक खोज . से गायब है टूलटिप, लेकिन पैरामीटरयुक्त टेक्स्ट और अन्य पैरामीटर सूची तत्व पहले जैसे ही हैं।

आइए देखें वास्तविक निष्पादन योजना:

वास्तविक गैर-पैरामीटरयुक्त योजना

परिणाम पिछले पैरामीटर के समान हैं वास्तविक योजना, अब सूचकांक खोज . को छोड़कर टूलटिप गैर-पैरामीटरयुक्त मान '999' प्रदर्शित करता है। शीर्ष पर दिखाया गया क्वेरी टेक्स्ट @1 . का उपयोग करता है पैरामीटर मार्कर। गुण विंडो @1 . का भी उपयोग करती है और पैरामीटर का रनटाइम मान प्रदर्शित करता है।

क्वेरी पैरामीटरयुक्त कथन नहीं है तमाम सबूतों के विपरीत होने के बावजूद।

3. पैरामीटरकरण विफल

मेरा तीसरा उदाहरण भी नहीं है सर्वर द्वारा पैरामीटरयुक्त:

--लोअर फंक्शन यूज्ड सेलेक्ट यू.डिस्प्लेनाम, लोवर(यू.डिस्प्लेनाम) डीबीओ से। यूजर्स यू जहां यू.रेपुटेशन =999;

अनुमानित योजना है:

अनुमानित योजना मानकीकरण विफल

@1 . का कोई उल्लेख नहीं है पैरामीटर अब कहीं भी, और पैरामीटर सूची गुण विंडो का अनुभाग अनुपलब्ध है।

वास्तविक निष्पादन योजना समान है, इसलिए मैं इसे दिखाने की जहमत नहीं उठाऊंगा।

4. समानांतर पैरामीटरयुक्त योजना

मैं आपको निष्पादन योजना में समानता का उपयोग करते हुए एक और उदाहरण दिखाना चाहता हूं। मेरे परीक्षण प्रश्नों की कम अनुमानित लागत का अर्थ है कि हमें समानता के लिए लागत सीमा को 1 तक कम करने की आवश्यकता है:

EXECUTE sys.sp_configure @configname ='समानता के लिए लागत सीमा', @configvalue =1;RECONFIGURE;

इस बार उदाहरण थोड़ा अधिक जटिल है:

 dbo से U.DisplayName चुनें। जहां U.Reputation>=5 और U.DisplayName> N'ZZZ' U.Reputation DESC द्वारा ऑर्डर;

अनुमानित निष्पादन योजना है:

अनुमानित समानांतर पैरामीटरयुक्त योजना

शीर्ष पर मौजूद क्वेरी टेक्स्ट बिना पैरामीटर के बना रहता है जबकि बाकी सब कुछ है। अब दो पैरामीटर मार्कर हैं, @1 और @2 , क्योंकि सरल मानकीकरण दो उपयुक्त शाब्दिक मूल्य मिले।

वास्तविक निष्पादन योजना उदाहरण 1 के पैटर्न का अनुसरण करती है:

वास्तविक समानांतर पैरामीटरयुक्त योजना

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

विश्वसनीय तरीके

अब तक दिखाए गए सभी व्यवहारों के कारण हैं, और इसके अलावा कुछ और भी हैं। जब मैं योजना संकलन को कवर करूंगा, तो मैं इस श्रृंखला के अगले भाग में इनमें से कई को समझाने का प्रयास करूंगा।

इस बीच, सामान्य रूप से शोप्लान और विशेष रूप से SSMS की स्थिति आदर्श से कम है। यह उन लोगों के लिए भ्रमित करने वाला है जो अपने पूरे करियर में SQL सर्वर के साथ काम कर रहे हैं। आप किन पैरामीटर मार्करों पर भरोसा करते हैं और किन पैरामीटर मार्करों को आप अनदेखा करते हैं?

यह निर्धारित करने के लिए कई विश्वसनीय तरीके हैं कि क्या किसी विशेष कथन में सरल मानकीकरण सफलतापूर्वक लागू किया गया था या नहीं।

क्वेरी स्टोर

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

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

इन शर्तों को पूरा करने के बाद, पोस्ट-निष्पादन शोप्लान आउटपुट में StatementParameterizationType सहित अतिरिक्त विशेषताएं शामिल हैं। . जैसा कि नाम से पता चलता है, इसमें एक कोड होता है जो कथन के लिए उपयोग किए जाने वाले पैरामीटर के प्रकार का वर्णन करता है।

जब किसी योजना का रूट नोड चुना जाता है तो यह SSMS गुण विंडो में दिखाई देता है:

StatementParameterizationType

मान sys.query_store_query . में प्रलेखित हैं :

  • 0 - कोई नहीं
  • 1 - उपयोगकर्ता (स्पष्ट मानकीकरण)
  • 2 - सरल मानकीकरण
  • 3 - जबरन पैरामीटरकरण

यह लाभकारी विशेषता केवल SSMS में तब दिखाई देती है जब एक वास्तविक जब एक अनुमानित . योजना का अनुरोध किया जाता है और अनुपलब्ध होता है योजना का चयन किया गया है। यह याद रखना महत्वपूर्ण है कि योजना संचित . होनी चाहिए . अनुमानित . का अनुरोध करना एसएसएमएस से योजना उत्पादित योजना को कैश नहीं करती है (एसक्यूएल सर्वर 2012 के बाद से)।

एक बार योजना कैश हो जाने के बाद, StatementParameterizationType sys.dm_exec_query_plan . के माध्यम से सामान्य स्थानों में दिखाई देता है ।

आप अन्य स्थानों पर भी भरोसा कर सकते हैं पैरामीटरकरण प्रकार क्वेरी स्टोर में रिकॉर्ड किया गया है, जैसे query_parameterization_type_desc sys.query_store_query . में कॉलम ।

एक महत्वपूर्ण चेतावनी। जब क्वेरी OPERATION_MODE स्टोर करती है READ_ONLY पर सेट है , StatementParameterizationType विशेषता अभी भी SSMS वास्तविक . में भरी हुई है योजनाएं—लेकिन यह हमेशा शून्य है —एक गलत धारणा देते हुए कथन को उस समय परिमापित नहीं किया गया था जब यह अच्छी तरह से हो सकता था।

यदि आप क्वेरी स्टोर को सक्षम करने में प्रसन्न हैं, तो सुनिश्चित करें कि यह पढ़ा-लिखा है, और केवल SSMS में निष्पादन के बाद की योजनाओं को देखें, यह आपके लिए काम करेगा।

मानक योजना विधेय

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

हालाँकि, आप व्यक्तिगत योजना ऑपरेटरों से जुड़ी संपत्तियों पर भरोसा कर सकते हैं। दिए गए उदाहरण दिखाते हैं कि ये टूलटिप्स . में मौजूद हैं जब एक ऑपरेटर पर मँडराते हैं।

एक विधेय जिसमें @1 . जैसे पैरामीटर मार्कर होते हैं या @2 एक पैरामीटरयुक्त योजना को इंगित करता है। जिन ऑपरेटरों में पैरामीटर होने की सबसे अधिक संभावना है, वे हैं इंडेक्स स्कैन , सूचकांक खोज , और फ़िल्टर करें

पैरामीटर मार्करों के साथ विधेय

अगर नंबरिंग @1 . से शुरू होती है , यह सरल मानकीकरण . का उपयोग करता है . जबरन पैरामीटरकरण @0 . से शुरू होता है . मुझे यह उल्लेख करना चाहिए कि यहां प्रलेखित नंबरिंग योजना किसी भी समय परिवर्तन के अधीन है:

चेतावनी बदलें

फिर भी, यही वह तरीका है जिसका मैं उपयोग करता हूं अक्सर यह निर्धारित करने के लिए कि क्या कोई योजना सर्वर-साइड मानकीकरण के अधीन थी। पैरामीटर मार्करों वाले विधेय के लिए नेत्रहीन रूप से एक योजना की जांच करना आम तौर पर त्वरित और आसान है। यह विधि दोनों प्रकार की योजनाओं के लिए भी काम करती है, अनुमानित और वास्तविक

गतिशील प्रबंधन ऑब्जेक्ट

प्लान कैश और संबंधित डीएमओ को क्वेरी करने के कई तरीके हैं, यह निर्धारित करने के लिए कि क्या स्टेटमेंट को पैरामीटर किया गया था। स्वाभाविक रूप से, ये प्रश्न केवल कैश में योजनाओं पर काम करते हैं, इसलिए विवरण को पूरा करने के लिए निष्पादित किया जाना चाहिए, कैश किया जाना चाहिए, और बाद में किसी भी कारण से बेदखल नहीं किया जाना चाहिए।

सबसे सीधा तरीका है तदर्थ . की तलाश करना रुचि के विवरण के लिए एक सटीक SQL पाठ्य मिलान का उपयोग करके योजना बनाएं। तदर्थ योजना एक खोल होगी जिसमें एक पैरामीटरेटेडप्लानहैंडल . है यदि कथन सर्वर द्वारा परिचालित किया जाता है। तब प्लान हैंडल का उपयोग तैयार . का पता लगाने के लिए किया जाता है योजना। एक तदर्थ यदि तदर्थ कार्यभार के लिए ऑप्टिमाइज़ेशन सक्षम है, और विचाराधीन कथन केवल एक बार निष्पादित किया गया है, तो योजना मौजूद नहीं होगी।

इस प्रकार की पूछताछ अक्सर एक्सएमएल की एक महत्वपूर्ण मात्रा को खत्म कर देती है और पूरे प्लान कैश को कम से कम एक बार स्कैन करती है। कोड को गलत करना भी आसान है, कम से कम नहीं क्योंकि कैश में योजनाएं पूरे बैच को कवर करती हैं। एक बैच में कई स्टेटमेंट हो सकते हैं, जिनमें से प्रत्येक को पैरामीटर किया जा सकता है या नहीं भी। सभी डीएमओ एक ही ग्रैन्युलैरिटी (बैच या स्टेटमेंट) पर काम नहीं करते हैं, जिससे अनस्टक आना काफी आसान हो जाता है।

ब्याज के बयानों को सूचीबद्ध करने का एक प्रभावी तरीका, केवल उन व्यक्तिगत बयानों के लिए योजना के अंशों के साथ, नीचे दिखाया गया है:

सेलेक्ट स्टेटमेंट टेक्स्ट =सबस्ट्रिंग (टी। [टेक्स्ट], 1 + (क्यूएस.स्टेटमेंट_स्टार्ट_ऑफसेट / 2), 1 + ((क्यूएस.स्टेटमेंट_एंड_ऑफसेट - क्यूएस.स्टेटमेंट_स्टार्ट_ऑफसेट) / 2)), इस पैरामीटराइज्ड =आईआईएफ (टी। [टेक्स्ट] LIKE N'(%', 'Yes', 'No'), query_plan =TRY_CONVERT(xml, P.query_plan)FROM sys.dm_exec_query_stats AS QSCROSS APPLY sys.dm_exec_sql_text (QS_[sql_handle]) AS TCROSS APPLY sys.dm.dm. QS.plan_handle, QS.statement_start_offset, QS.statement_end_offset) PWHERE के रूप में -- रुचि के विवरण T.[text] LIKE N'%DisplayName%Users%' -- इस तरह की क्वेरी को बाहर करें और T.[text] NOT LIKE N' %sys.dm%'ORDER BY QS.last_execution_time ASC, QS.statement_start_offset ASC;

उदाहरण के लिए, आइए पहले के चार उदाहरणों वाला एक बैच चलाते हैं:

डाटाबेस स्कोप्ड कॉन्फ़िगरेशन को बदलें PROCEDURE_CACHE;GO-- उदाहरण 1चुनें U.DisplayName dbo से। यूज़र्स जैसे यू जहां यू।प्रतिष्ठा =999; -- उदाहरण 2 चयन करें U.DisplayName, U.CreationDate FROM dbo.Users as U जहां U.Reputation =999; - उदाहरण 3 चयन करें U.DisplayName, LOWER(U.DisplayName)Dbo से। यूज़र्स जहाँ आप U.Reputation =999; -- उदाहरण 4 dbo से U.DisplayName का चयन करें। जहां U.Reputation>=5 और U.DisplayName> N'ZZZ' U.Reputation DESC द्वारा आदेश;GO

DMO क्वेरी का आउटपुट है:

DMO क्वेरी आउटपुट

यह पुष्टि करता है कि केवल उदाहरण 1 और 4 को सफलतापूर्वक पैरामीटर किया गया था।

प्रदर्शन काउंटर

अनुमानित दोनों के लिए पैरामीटरकरण गतिविधि में विस्तृत जानकारी प्राप्त करने के लिए SQL सांख्यिकी प्रदर्शन काउंटर का उपयोग करना संभव है और वास्तविक योजनाएँ। उपयोग किए गए काउंटर प्रति-सत्र के दायरे में नहीं हैं, इसलिए सटीक परिणाम प्राप्त करने के लिए आपको किसी अन्य समवर्ती गतिविधि के साथ एक परीक्षण उदाहरण का उपयोग करने की आवश्यकता होगी।

मैं sys.dm_exec_query_optimizer_info के डेटा के साथ पैरामीटरीकरण काउंटर जानकारी को पूरक करने जा रहा हूं डीएमओ तुच्छ योजनाओं पर भी आंकड़े उपलब्ध कराएगा।

काउंटर जानकारी पढ़ने वाले बयानों को उन काउंटरों को स्वयं संशोधित करने से रोकने के लिए कुछ देखभाल की आवश्यकता है। मैं कुछ अस्थायी संग्रहीत कार्यविधियाँ बनाकर इसका समाधान करने जा रहा हूँ:

प्रक्रिया बनाएं #TrivialPlansASSET NOCOUNT ON; OI चुनें। [काउंटर], OI.occurrenceFROM sys.dm_exec_query_optimizer_info जहां OI है। पीसी का चयन करें। 

किसी विशेष कथन का परीक्षण करने के लिए स्क्रिप्ट इस तरह दिखती है:

डाटाबेस स्कोप्ड कॉन्फ़िगरेशन स्पष्ट प्रक्रिया_CACHE;GOEXECUTE #PerfCounters;EXECUTE #TrivialPlans;GOSET SHOWPLAN_XML ON;GO-- परीक्षण के तहत कथन:- उदाहरण 3 चयन करें U.DisplayName, LOWER(U.DisplayName) यूज़ यू जहां यू.प्रतिष्ठा =999;GOSET SHOWPLAN_XML OFF;GOEXECUTE #TrivialPlans;EXECUTE #PerfCounters;

SHOWPLAN_XML पर टिप्पणी करें लक्ष्य विवरण को चलाने के लिए बैच आउट करें और वास्तविक . प्राप्त करें योजनाएँ। उन्हें अनुमानित . के स्थान पर रहने दें निष्पादन योजनाएं।

पूरी बात को लिखित रूप में चलाने से निम्नलिखित परिणाम मिलते हैं:

प्रदर्शन काउंटर परीक्षा परिणाम

मैंने ऊपर हाइलाइट किया है कि उदाहरण 3 का परीक्षण करते समय मान कहाँ बदल गए हैं।

1050 से 1051 तक "तुच्छ योजना" काउंटर में वृद्धि से पता चलता है कि परीक्षण विवरण के लिए एक तुच्छ योजना मिली थी।

सरल पैरामीटरीकरण काउंटरों में प्रयासों और विफलताओं दोनों के लिए 1 की वृद्धि हुई, यह दिखाते हुए कि SQL सर्वर ने कथन को पैरामीटर करने का प्रयास किया, लेकिन विफल रहा।

भाग 3 का अंत

इस शृंखला के अगले भाग में, मैं उन जिज्ञासु चीज़ों के बारे में बताऊँगा जिन्हें हमने सरल मानकीकरण का वर्णन करते हुए देखा है। और तुच्छ योजनाएँ संकलन प्रक्रिया के साथ बातचीत करें।

अगर आपने अपनी समानता के लिए लागत सीमा . बदल दी है उदाहरणों को चलाने के लिए, इसे रीसेट करना याद रखें (मेरा 50 पर सेट किया गया था):

EXECUTE sys.sp_configure @configname ='समानता के लिए लागत सीमा', @configvalue =50;RECONFIGURE;

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL में विशिष्ट मानों की गणना कैसे करें

  2. SQL में डुप्लिकेट कैसे न दिखाएं

  3. DROP से बेहतर ALTER

  4. TimescaleDB के लिए उन्नत डेटाबेस निगरानी और प्रबंधन

  5. प्रिज्मा में एक अद्वितीय कुंजी के लिए कई क्षेत्रों का उपयोग करना