परिचय
1998 और 2014 की शुरुआत के बीच, SQL सर्वर ने एक कार्डिनैलिटी एस्टिमेटर (CE) का उपयोग किया, लेकिन SQL सर्वर के हर नए प्रमुख संस्करण (SQL Server 2008 R2 के अपवाद के साथ) के साथ एक नया डेटाबेस संगतता स्तर पेश करेगा। SQL सर्वर के लिए मूल संगतता स्तर तालिका 1 में प्रमुख SQL सर्वर संस्करण द्वारा दिखाए जाते हैं:
SQL Server version | मूल संगतता स्तर |
---|---|
एसक्यूएल सर्वर 7.0 | 70 |
एसक्यूएल सर्वर 2000 | 80 |
एसक्यूएल सर्वर 2005 | 90 |
एसक्यूएल सर्वर 2008 एसक्यूएल सर्वर 2008 आर2 | 100 |
एसक्यूएल सर्वर 2012 | 110 |
एसक्यूएल सर्वर 2014 | 120 |
SQL सर्वर 2016 | 130 |
एसक्यूएल सर्वर 2017 | 140 |
एसक्यूएल सर्वर 2019 | 150 |
तालिका 1:SQL सर्वर संस्करण और मूल संगतता स्तर
SQL Server 7.0 और SQL Server 2012 के बीच, डेटाबेस के संगतता स्तर और उस डेटाबेस में क्वेरीज़ का उपयोग करने वाले कार्डिनैलिटी अनुमानक के बीच कोई संबंध नहीं था। इसका कारण यह है कि केवल एक कार्डिनैलिटी अनुमानक था, जिसे 1998 में एक प्रमुख अद्यतन प्राप्त हुआ था। डेटाबेस के संगतता स्तर का उपयोग केवल पीछे की कार्यात्मक संगतता के लिए और SQL सर्वर के प्रत्येक नए संस्करण में कुछ नई सुविधाओं को सक्षम/अक्षम करने के लिए किया गया था (इसे देखें) उदाहरण के लिए स्टैक एक्सचेंज उत्तर 80 और 90 के बीच व्यवहार कैसे बदल गया, शायद सबसे विघटनकारी परिवर्तन)। SQL सर्वर डेटाबेस के फ़ाइल संस्करण के विपरीत, आप किसी भी समय डेटाबेस के संगतता स्तर को किसी भी समर्थित संगतता स्तर पर एक साधारण ALTER DATABASE कमांड के साथ बदल सकते हैं।
डिफ़ॉल्ट रूप से, यदि आपने एक नया . बनाया है SQL सर्वर 2012 में डेटाबेस, संगतता स्तर 110 पर सेट किया जाएगा, लेकिन आप चाहें तो इसे पहले के स्तर पर बदल सकते हैं। अगर आपने बहाल SQL Server 2008 इंस्टेंस से SQL Server 2012 इंस्टेंस पर डेटाबेस बैकअप, यह डेटाबेस के फ़ाइल संस्करण को अपग्रेड करेगा, लेकिन संगतता स्तर को छोड़ देगा जहां यह SQL Server 2008 इंस्टेंस पर था (जब तक कि यह 80 नहीं था, जो होगा 90 में अपग्रेड करें, SQL सर्वर 2012 द्वारा समर्थित न्यूनतम संस्करण)। डेटाबेस के फ़ाइल संस्करण और डेटाबेस के संगतता स्तर के बीच मूलभूत अंतर को जानने के अलावा, अधिकांश DBA और डेवलपर्स को SQL Server 2014 जारी होने से पहले डेटाबेस संगतता स्तरों के बारे में बहुत अधिक चिंता करने की आवश्यकता नहीं थी। कई मामलों में, SQL सर्वर के नए संस्करण में माइग्रेशन के बाद अधिकांश डेटाबेस में उनके संगतता स्तर कभी नहीं बदले। यह आमतौर पर किसी भी समस्या का कारण नहीं बनता है जब तक कि आपको वास्तव में एक नई सुविधा या व्यवहार की आवश्यकता नहीं होती है जो नवीनतम डेटाबेस संगतता स्तर में बदल जाती है।
SQL सर्वर 2014 में बदलाव
SQL सर्वर 2014 की रिलीज़ के साथ यह पुरानी स्थिति मौलिक रूप से बदल गई। SQL Server 2014 ने एक "नया" कार्डिनैलिटी अनुमानक पेश किया जो डिफ़ॉल्ट रूप से सक्षम था। जब एक डेटाबेस 120 संगतता स्तर में था। क्लासिक श्वेतपत्र में, "एसक्यूएल सर्वर 2014 कार्डिनैलिटी एस्टीमेटर के साथ आपकी क्वेरी योजनाओं का अनुकूलन," जो सैक अप्रैल 2014 में इस परिवर्तन की पृष्ठभूमि और व्यवहार की व्याख्या करता है। कई मामलों में, नई कार्डिनैलिटी का उपयोग करते समय आपके अधिकांश प्रश्न तेजी से चले गए अनुमानक, लेकिन कुछ प्रश्नों में भाग लेना काफी सामान्य था, जिसमें नए कार्डिनैलिटी अनुमानक के साथ प्रमुख प्रदर्शन प्रतिगमन थे। यदि ऐसा होता है, तो SQL सर्वर 2014 में नए CE के कारण होने वाले प्रदर्शन के मुद्दों को कम करने के लिए कई विकल्प नहीं थे। जो के श्वेतपत्र में उन विकल्पों को बहुत विस्तार से शामिल किया गया है, लेकिन अनिवार्य रूप से, आप इंस्टेंस-स्तरीय ट्रेस फ़्लैग या क्वेरी-स्तरीय क्वेरी संकेतों तक सीमित थे, यह नियंत्रित करने के लिए कि कौन सा कार्डिनैलिटी अनुमानक क्वेरी ऑप्टिमाइज़र द्वारा उपयोग किया गया था, जब तक कि आप संगतता स्तर 110 या उससे कम पर वापस नहीं लौटना चाहते थे। ।
SQL सर्वर 2016 में बदलाव
SQL सर्वर 2016 ने डेटाबेस स्कोप्ड कॉन्फ़िगरेशन विकल्प पेश किए, जो आपको कुछ व्यवहारों को नियंत्रित करने की क्षमता देते हैं जो पूर्व में उदाहरण स्तर पर कॉन्फ़िगर किए गए थे, एक वैकल्पिक डेटाबेस स्कोप्ड कॉन्फ़िगरेशन कमांड का उपयोग करके। SQL सर्वर 2016 में, इन विकल्पों में MAXDOP, LEGACY_CARDINALITY ESTIMATION, PARAMETER_SNIFFING और QUERY_OPTIMIZER_HOTFIXES शामिल थे। एक CLEAR PROCEDURE_CACHE विकल्प भी था जो आपको एकल डेटाबेस के लिए संपूर्ण योजना कैश को साफ़ करने देता है।
इस संदर्भ में सबसे अधिक प्रासंगिक LEGACY_CARDINALITY ESTIMATION और QUERY_OPTIMIZER_HOTFIXES डेटाबेस स्कोप्ड कॉन्फ़िगरेशन विकल्प हैं। LEGACY_CARDINALITY ESTIMATION डेटाबेस संगतता स्तर सेटिंग की परवाह किए बिना लीगेसी CE को सक्षम बनाता है। यह ट्रेस फ्लैग 9481 के बराबर है, लेकिन यह केवल विचाराधीन डेटाबेस को प्रभावित करता है, संपूर्ण इंस्टेंस को नहीं। यह आपको कई कार्यात्मक और प्रदर्शन लाभ प्राप्त करने के लिए डेटाबेस संगतता स्तर को 130 पर सेट करने की अनुमति देता है, लेकिन फिर भी लीगेसी सीई डेटाबेस-व्यापी का उपयोग करता है (जब तक कि क्वेरी-स्तरीय क्वेरी संकेत द्वारा ओवरराइड नहीं किया जाता)।
QUERY_OPTIMIZER_HOTFIXES विकल्प डेटाबेस स्तर पर ट्रेस फ्लैग 4199 के बराबर है। SQL सर्वर 2016 पहले . सभी क्वेरी ऑप्टिमाइज़र हॉटफिक्सेस को सक्षम करेगा SQL सर्वर 2016 RTM जब आप 130 डेटाबेस संगतता स्तर (ट्रेस ध्वज 4199 को सक्षम किए बिना) का उपयोग करते हैं। यदि आप TF 4199 को सक्षम करते हैं या QUERY_OPTIMIZER_HOTFIXES को सक्षम करते हैं, तो आपको बाद जारी किए गए सभी क्वेरी ऑप्टिमाइज़र हॉटफिक्स भी प्राप्त होंगे। SQL सर्वर 2016 RTM.
SQL सर्वर 2016 SP1 ने USE HINT क्वेरी संकेत भी पेश किए जो पुराने QUERYTRACEON क्वेरी संकेतों की तुलना में उपयोग करने, समझने और याद रखने में आसान हैं। यह आपको ऑप्टिमाइज़र व्यवहार पर और भी बेहतर नियंत्रण देता है जो डेटाबेस संगतता स्तर और कार्डिनैलिटी अनुमानक के संस्करण से संबंधित है जिसका उपयोग किया जा रहा है। आपके द्वारा चलाए जा रहे SQL सर्वर के सटीक निर्माण के लिए मान्य USE HINT नामों की सूची प्राप्त करने के लिए आप sys.dm_exec_valid_use_hints को क्वेरी कर सकते हैं।
SQL सर्वर 2017 में बदलाव
नई अनुकूली क्वेरी संसाधन सुविधा SQL Server 2017 में जोड़ी गई थी, और जब आप डेटाबेस संगतता स्तर 140 का उपयोग कर रहे होते हैं, तो यह डिफ़ॉल्ट रूप से सक्षम होती है।
Microsoft "नई सीई" और "ओल्ड सीई" की पुरानी शब्दावली से दूर जाने की कोशिश कर रहा है, क्योंकि SQL सर्वर के प्रत्येक नए प्रमुख संस्करण में क्वेरी ऑप्टिमाइज़ेशन में वास्तव में परिवर्तन और सुधार हैं। इस वजह से, अब एक भी "नया सीई" नहीं है। इसके बजाय, Microsoft CE70 (SQL Server 7.0 के लिए SQL Server 2012 के माध्यम से डिफ़ॉल्ट CE), SQL सर्वर 2014 के लिए CE120, SQL सर्वर 2016 के लिए CE130, SQL सर्वर 2017 के लिए CE140 और SQL सर्वर 2019 के लिए CE150 को संदर्भित करना चाहता है। SQL सर्वर से शुरू 2017 CU10, आप क्वेरी संकेतों के साथ इसे नियंत्रित करने के लिए USE HINT कार्यक्षमता का उपयोग कर सकते हैं। उदाहरण के लिए:
/*...query...*/ OPTION (USE HINT('QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_130'));
... किसी विशेष क्वेरी के लिए CE130 कार्डिनैलिटी अनुमानक को बाध्य करने के लिए एक वैध क्वेरी संकेत होगा।
SQL सर्वर 2019 में बदलाव
SQL सर्वर 2019 और भी अधिक प्रदर्शन सुधार और व्यवहार परिवर्तन जोड़ रहा है जो डिफ़ॉल्ट रूप से सक्षम होते हैं जब कोई डेटाबेस संगतता मोड 150 का उपयोग कर रहा होता है। एक प्रमुख उदाहरण स्केलर UDF इनलाइनिंग है। एक अन्य उदाहरण इंटेलिजेंट क्वेरी प्रोसेसिंग फीचर है, जो SQL सर्वर 2017 में अनुकूली क्वेरी प्रोसेसिंग का सुपरसेट है।
पांच नए USE HINT विकल्प हैं, जिसमें बैच मोड को अक्षम करने या अनुकूली मेमोरी ग्रांट फीडबैक को अक्षम करने के तरीके शामिल हैं, जैसा कि तालिका 2 में दिखाया गया है:
DISABLE_BATCH_MODE_ADAPTIVE_JOINS |
DISABLE_BATCH_MODE_MEMORY_GRANT_FEEDBACK |
DISABLE_INTERLEAVED_EXECUTION_TVF |
DISALLOW_BATCH_MODE |
QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_150 |
तालिका 2 :उपयोग के नए सुझाव
और सोलह नए डेटाबेस स्कोप्ड कॉन्फ़िगरेशन विकल्प भी हैं (CTP 2.2 के अनुसार) जो आपको अधिक आइटम्स का डेटाबेस-स्तर नियंत्रण प्रदान करते हैं जो ट्रेस फ़्लैग्स या डेटाबेस संगतता स्तर से भी प्रभावित होते हैं। यह आपको डेटाबेस संगतता स्तर 150 के साथ डिफ़ॉल्ट रूप से सक्षम किए गए उच्च स्तरीय परिवर्तनों का अधिक परिष्कृत नियंत्रण प्रदान करता है। ये तालिका 3 में सूचीबद्ध हैं:
ACCELERATED_PLAN_FORCING | ELEVATE_RESUMABLE | ROW_MODE_MEMORY_GRANT_FEEDBACK |
BATCH_MODE_ADAPTIVE_JOINS | GLOBAL_TEMPORARY_TABLE_AUTO_DROP | TSQL_SCALAR_UDF_INLINING |
BATCH_MODE_MEMORY_GRANT_FEEDBACK | INTERLEAVED_EXECUTION_TVF | XTP_PROCEDURE_EXECUTION_STATISTICS |
BATCH_MODE_ON_ROWSTORE | ISOLATE_SECURITY_POLICY_CARDINALITY | XTP_QUERY_EXECUTION_STATISTICS |
DEFERRED_COMPILATION_TV | LIGHTWEIGHT_QUERY_PROFILING | |
ELEVATE_ONLINE | OPTIMIZE_FOR_AD_HOC_WORKLOADS |
तालिका 3 :नया डेटाबेस स्कोप्ड कॉन्फ़िगरेशन विकल्प
निष्कर्ष
SQL सर्वर (अर्थात् SQL सर्वर 2016 या नया) के आधुनिक संस्करण में माइग्रेट करना SQL सर्वर के पुराने संस्करणों की तुलना में काफी अधिक जटिल है। विभिन्न डेटाबेस संगतता स्तरों और विभिन्न कार्डिनैलिटी अनुमानक संस्करणों से जुड़े परिवर्तनों के कारण, SQL सर्वर के नए संस्करण पर आप किस डेटाबेस संगतता स्तर का उपयोग करना चाहते हैं, इसमें कुछ विचार, योजना और वास्तविक परीक्षण करना वास्तव में बहुत महत्वपूर्ण है। आपके मौजूदा डेटाबेस को माइग्रेट कर रहे हैं।
Microsoft की अनुशंसित अपग्रेड प्रक्रिया नवीनतम SQL सर्वर संस्करण में अपग्रेड करना है, लेकिन स्रोत डेटाबेस संगतता स्तर को बनाए रखना है। फिर, प्रत्येक डेटाबेस पर क्वेरी स्टोर सक्षम करें और वर्कलोड पर बेसलाइन डेटा एकत्र करें। इसके बाद, आप डेटाबेस संगतता स्तर को नवीनतम संस्करण पर सेट करते हैं, और फिर अंतिम ज्ञात अच्छी योजना को बाध्य करके प्रदर्शन प्रतिगमन को ठीक करने के लिए क्वेरी स्टोर का उपयोग करते हैं।
आप वास्तव में एक बेतरतीब "अंधे" प्रवास से बचना चाहते हैं, जहां आप इस बात से अनजान हैं कि यह कैसे काम करता है और आपका कार्यभार इन परिवर्तनों पर कैसे प्रतिक्रिया करेगा। डेटाबेस संगतता स्तर को एक उपयुक्त संस्करण में बदलना और उपयुक्त डेटाबेस स्कोप्ड कॉन्फ़िगरेशन विकल्पों का उपयोग करना, साथ ही उपयुक्त क्वेरी संकेतों के साथ जहाँ बिल्कुल आवश्यक हो, SQL सर्वर के आधुनिक संस्करणों के साथ अत्यंत महत्वपूर्ण है।