इस लेख में, हम डेटाबेस स्कोप्ड कॉन्फ़िगरेशन और SQL सर्वर 2017 स्वचालित योजना सुधार की जांच करेंगे। Microsoft ने SQL सर्वर 2017 में नई सुविधाएँ जोड़ीं जिससे क्वेरी प्रदर्शन में सुधार हुआ।
SQL सर्वर क्वेरी प्रदर्शन निष्पादन योजना की गुणवत्ता और सटीकता से संबंधित है। जब हम कोई क्वेरी चलाते हैं, तो क्वेरी ऑप्टिमाइज़र कई निष्पादन योजनाओं का विश्लेषण करता है और फिर इष्टतम क्वेरी निष्पादन योजना पर निर्णय लेता है।
विरासत कार्डिनैलिटी अनुमान: कार्डिनैलिटी एस्टीमेटर भविष्यवाणी करता है कि क्वेरी कितनी पंक्तियों में वापस आएगी, साथ ही यह क्वेरी के मेमोरी आवंटन को भी निर्धारित करती है।
SQL सर्वर 2017 में, डिफ़ॉल्ट कार्डिनैलिटी एस्टीमेशन मॉडल संस्करण 14.0 है, लेकिन यदि आप कार्डिनैलिटी एस्टिमेटर के पुराने संस्करण 7.0 का उपयोग करना चाहते हैं, तो आप डेटाबेस स्कोप्ड कॉन्फ़िगरेशन में लीगेसी कार्डिनैलिटी एस्टीमेशन विकल्प को बदलकर ऐसा कर सकते हैं। मजबूत> अनुभाग।
लीगेसी कार्डिनैलिटी अनुमान का डिफ़ॉल्ट मान बंद है। इस प्रकार यदि आप पुराने संस्करण का उपयोग करना चाहते हैं, तो आपको इसे चालू करना होगा।
वैकल्पिक रूप से, आप इस गुण को T-SQL में बदल सकते हैं।
ALTER DATABASE स्कोप्ड कॉन्फ़िगरेशन सेट LEGACY_CARDINALITY_ESTIMATION =OFF|ON;
हालांकि, यदि आप इस सेटिंग को सक्षम करते हैं, तो यह सभी प्रश्नों को प्रभावित करेगा। परिणामस्वरूप, यह क्वेरी प्रदर्शन को नुकसान पहुंचा सकता है। इसे रोकने के लिए, आप FORCE_LEGACY_CARDINALITY_ESTIMATION संकेत का उपयोग कर सकते हैं।
जब हम इस क्वेरी को वाइडवर्ल्ड इम्पोर्टर्स डेटाबेस में चलाते हैं, तो यह स्वचालित रूप से कार्डिनैलिटी अनुमान के एक नए संस्करण का उपयोग करेगा।
चुनें [o].[CustomerID], o.LastEditedBy , [o]।
जब हम क्वेरी में FORCE_LEGACY_CARDINALITY_ESTIMATION जोड़ते हैं, तो क्वेरी ऑप्टिमाइज़र कार्डिनैलिटी अनुमान के पिछले या पुराने संस्करण का उपयोग करेगा।
MAXDOP : हम एक व्यक्तिगत डेटाबेस के लिए समांतरता की अधिकतम डिग्री निर्धारित कर सकते हैं। इस सुविधा के बनने से पहले, हम केवल MAXDOP सर्वर स्तर को ही कॉन्फ़िगर कर सकते थे।
MAXDOP क्वेरी संकेत हमें समानांतर में क्वेरी चलाने की अनुमति देता है।
ALTER DATABASE स्कोप्ड कॉन्फ़िगरेशन सेट MAXDOP =4; जाओ
पैरामीटर सूँघना: जब कोई क्वेरी निष्पादन समय नाटकीय रूप से बदलता है और इस बार परिवर्तन क्वेरी पैरामीटर से संबंधित होता है, तो इसे पैरामीटर सूँघना कहा जाता है।
अब, हम AdventureWorks डेटाबेस पर एक संग्रहीत कार्यविधि बनाएंगे। हम अलग-अलग पैरामीटर भेजेंगे और निष्पादन योजनाओं की तुलना करेंगे।
ड्रॉप प्रक्रिया यदि मौजूद है Get_OrdersGOCREATE PROCEDURE Get_Orderes@ProductID INTASSELECT SalesOrderDetailID, OrderQtyFROM Sales.SalesOrderDetailWHERE ProductID =@ProductID;GO/******** उत्पादन सर्वर में इस स्क्रिप्ट का उपयोग न करें! *******/ DBCC FREEPROCCACHE--क्वेरी MarsEXEC Get_OrderID_OrderQty @ProductID=870DBCC FREEPROCCACHE--Queries VenusEXEC Get_OrderID_OrderQty @ProductID=897जैसा कि नीचे की छवि में दिखाया गया है, SQL सर्वर एक ही क्वेरी के लिए एक अलग निष्पादन योजना बनाता है। क्वेरी मार्स निष्पादन योजना एक अनुक्रमणिका की अनुशंसा करती है। क्वेरी पैरामीटर इष्टतम निष्पादन योजना को बदलता है।
इस क्वेरी को निष्पादित करें और निष्पादन योजनाओं को देखें।
DBCC FREEPROCCACHE--क्वेरी MarsEXEC Get_OrderID_OrderQty @ProductID=870--Query VenusEXEC Get_OrderID_OrderQty @ProductID=897
क्वेरी वीनस निष्पादन योजना क्वेरी मंगल निष्पादन योजना के समान है। यह पैरामीटर सूँघने वाला है क्योंकि कैश्ड निष्पादन योजना को क्वेरी मार्स निष्पादन योजना के लिए संकलित किया गया है। इस कारण से, क्वेरी वीनस उसी निष्पादन योजना का उपयोग करता है।
अब, हम पैरामीटर सूँघने को अक्षम कर देंगे और उन्हीं प्रश्नों को चलाएंगे।
डाटाबेस स्कोप्ड कॉन्फ़िगरेशन सेट करें PARAMETER_SNIFFING =OFF;DBCC FREEPROCCACHE--क्वेरी MarsEXEC Get_OrderID_OrderQty @ProductID=870--Query VenusEXEC Get_OrderID_OrderQty @ProductID=897आइए जांच करें:
SQL सर्वर क्वेरी ऑप्टिमाइज़र ने क्वेरी वीनस और क्वेरी मार्स के लिए इष्टतम निष्पादन योजना तैयार की। यह दृष्टिकोण क्वेरी को इष्टतम प्रदर्शन प्रदान करता है।
इस समस्या से बचने के लिए कुछ विकल्प हैं:
- विकल्प (पुनरावृत्ति)
- विकल्प (के लिए ऑप्टिमाइज़ करें(@VARIABLE=UNKNOWN))
स्वचालित योजना सुधार
SQL सर्वर 2017 में स्वचालित योजना सुधार नामक एक नई सुविधा शामिल है। जब हम किसी क्वेरी को निष्पादित करते हैं, तो क्वेरी ऑप्टिमाइज़र एक निष्पादन योजना बनाता है। कुछ कारणों से, क्वेरी ऑप्टिमाइज़र गलत निष्पादन योजना चुनता है। कुछ कारण इस प्रकार हैं:
- एक प्रश्न जो प्रदर्शन मानदंडों को पूरा नहीं करता है
- पुराने आंकड़े
- अनुपयुक्त अनुक्रमणिका
जब SQL सर्वर क्वेरी ऑप्टिमाइज़र निष्पादन योजना को बदलने का निर्णय लेता है और यह निष्पादन योजना प्रदर्शन को नुकसान पहुँचाती है, तो क्वेरी प्रदर्शन को योजना प्रतिगमन कहा जाता है। SQL सर्वर 2016 के साथ एक नई सुविधा आती है। यह उपकरण क्वेरी प्रदर्शन की निगरानी और समस्या निवारण में मदद करता है और साथ ही क्वेरी निष्पादन के प्रदर्शन मीट्रिक और काउंटरों को संग्रहीत करता है।
हम इन विकल्पों को डेटाबेस गुणों के अंतर्गत सक्षम कर सकते हैं।
अब, हम इस फीचर का डेमो बनाने जा रहे हैं। सबसे पहले, प्रक्रिया कैश साफ़ करें और एक संग्रहीत कार्यविधि बनाएँ।
/****************************************** इस स्क्रिप्ट का प्रयोग न करें उत्पादन सर्वर************/ उपयोग करें =चालू; डेटाबेस बदलें [वाइडवर्ल्ड इम्पोर्टर्स] QUERY_STORE CLEAR ALLDBCC FREEPROCCACHE सेट करें - यह कमांड SQL सर्वर में सभी प्रक्रिया कैश को साफ कर देगा। उत्पादन वातावरण में प्रयास न करें-- ALTER DATABASE WideWorldImporters SET AUTOMATIC_TUNING (FORCE_LAST_GOOD_PLAN =OFF); ड्रॉप प्रक्रिया यदि मौजूद है Test_CoddingSight2 जाओ PROC Test_CoddingSight2 @Id as INT as INT as select sum([UnitPrice]*[Quantity]) सेल्स से। ऑर्डरलाइन्स ओ इनर जॉइन सेल्स। ऑर्डर्स टाइप आईडी =ओ 1 पर। ऑर्डर आईडी =ओ। पैकेज आईडी जहां आईडी
इस चरण में, हम इस प्रक्रिया को विभिन्न मापदंडों के साथ निष्पादित करेंगे और निष्पादन समय का अंतर पाएंगे।
--क्वेरी AlphaDBCC FREEPROCCACHE EXEC Test_CoddingSight2 7GO 80DBCC FREEPROCCACHE EXEC Test_CoddingSight2 -1--क्वेरी BetaEXEC Test_CoddingSight2 7GO 80
जैसा कि आप देख सकते हैं, पहली क्वेरी 12 सेकंड में पूरी हुई, जबकि दूसरी 33 सेकंड में पूरी हुई। इस नाटकीय अंतर का कारण यह है कि क्वेरी अनुकूलक क्वेरी बीटा के लिए अनुपयुक्त निष्पादन योजना चुनता है।
आइए क्वेरी अल्फा और क्वेरी बीटा की निष्पादन योजनाओं की तुलना करें।
क्वेरी अल्फा की निष्पादन योजना
क्वेरी बीटा की निष्पादन योजना
ऊपर की छवियों में, क्वेरी ऑप्टिमाइज़र एक ही क्वेरी के लिए विभिन्न निष्पादन योजनाएँ बनाता है। जब हम उपभोक्ता प्रश्नों के शीर्ष संसाधन को देखते हैं , हम देख सकते हैं कि क्वेरी बीटा, क्वेरी अल्फ़ा की तुलना में अधिक संसाधनों की खपत करता है।
नीचे दी गई क्वेरी ट्यूनिंग अनुशंसाओं पर विस्तृत जानकारी लौटाएगी।
नाम, कारण, स्कोर,JSON_VALUE(विवरण, '$.implementationDetails.script') स्क्रिप्ट, विवरण के रूप में चुनें। .queryId', regressed_plan_id int '$.regressedPlanId', last_good_plan_id int '$.recommendedPlanId') विवरण के रूप में जहां JSON_VALUE(state, '$.currentValue') ='Active'
कारण कॉलम दिखाता है कि हमें यह सिफारिश क्यों लागू करनी है।
अब, हम स्वचालित योजना सुधार सक्षम के साथ क्वेरी अल्फा और क्वेरी बीटा फिर से चलाएंगे।
/****************************************** इस स्क्रिप्ट का प्रयोग न करें उत्पादन सर्वरों में QUERY_STORE सेट करें ALLDBCC मुफ़्त PROCCACHE साफ़ करें /**************************************** स्वचालित योजना सुधार सक्षम करें ********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************* होते पर); --क्वेरी AlphaDBCC FREEPROCCACHE EXEC Test_CoddingSight2 7GO 80DBCC FREEPROCCACHE EXEC Test_CoddingSight2 -1--क्वेरी बीटाEXEC Test_CoddingSight2 7GO 80
इस डेमो के बाद, क्वेरी अल्फा निष्पादन योजना को क्वेरी बीटा पर लागू किया जाता है। साथ ही, क्वेरी अल्फा और क्वेरी बीटा निष्पादन समय एक दूसरे के करीब हैं। नीचे दी गई क्वेरी स्वचालित योजना सुधार स्थिति लौटाएगी।
नाम, कारण, स्कोर,JSON_VALUE(state, '$.currentValue') स्थिति के रूप में,JSON_VALUE(विवरण, '$.implementationDetails.script') स्क्रिप्ट, विवरण के रूप में चुनें।* sys.dm_db_tuning_recommendations से क्रॉस लागू करें OPENJSON(विवरण) , '$.planForceDetails') के साथ ( query_id int '$.queryId', regressed_plan_id int '$.regressedPlanId', last_good_plan_id int '$.recommendedPlanId') विवरण के रूप मेंजहां JSON_VALUE(state, '$.currentValue')<='VALUE(state,'$.currentValue')<='VALUE /पूर्व>
साथ ही, हमें कुछ ग्राफिकल जानकारी जबरदस्त योजनाओं के साथ प्रश्न . में मिल सकती है . यह ग्राफ़ ज़बरदस्ती क्वेरी योजनाओं और क्वेरी को परिभाषित करता है।
संदर्भ
SQL सर्वर 2017 में स्वचालित योजना सुधार
कार्डिनैलिटी अनुमान