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

SQL सर्वर क्वेरी स्टोर

बेंजामिन नेवारेज़ लॉस एंजिल्स, कैलिफ़ोर्निया में स्थित एक स्वतंत्र सलाहकार हैं जो SQL सर्वर क्वेरी ट्यूनिंग और अनुकूलन में माहिर हैं। वह "एसक्यूएल सर्वर 2014 क्वेरी ट्यूनिंग और ऑप्टिमाइज़ेशन" और "इनसाइड द एसक्यूएल सर्वर क्वेरी ऑप्टिमाइज़र" के लेखक हैं और "एसक्यूएल सर्वर 2012 इंटर्नल्स" के सह-लेखक हैं। रिलेशनल डेटाबेस में 20 से अधिक वर्षों के अनुभव के साथ, बेंजामिन कई SQL सर्वर सम्मेलनों में एक वक्ता भी रहे हैं, जिसमें PASS समिट, SQL सर्वर कनेक्शन और SQLBits शामिल हैं। बेंजामिन का ब्लॉग http://www.benjaminnevarez.com पर पाया जा सकता है और उस तक बेंजामिननेवारेज़ डॉट कॉम के एडमिन और @BenjaminNevarez पर ट्विटर पर ई-मेल द्वारा भी पहुंचा जा सकता है।

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

यह सुविधा, जिसे क्वेरी स्टोर कहा जाता है, योजना परिवर्तनों से संबंधित प्रदर्शन समस्याओं में आपकी सहायता कर सकती है और जल्द ही SQL Azure और बाद में SQL सर्वर के अगले संस्करण पर उपलब्ध होगी। यद्यपि यह SQL सर्वर के एंटरप्राइज़ संस्करण पर उपलब्ध होने की उम्मीद है, यह अभी तक ज्ञात नहीं है कि यह मानक या किसी अन्य संस्करण पर उपलब्ध होगा या नहीं। क्वेरी स्टोर के लाभों को समझने के लिए, मुझे क्वेरी समस्या निवारण प्रक्रिया के बारे में संक्षेप में बात करने दें।

क्वेरी धीमी क्यों होती है?

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

योजना परिवर्तन

सत्र में, कॉनर ने पिकासो डेटाबेस क्वेरी ऑप्टिमाइज़र विज़ुअलाइज़र टूल का उपयोग किया, हालांकि इसका नाम से उल्लेख नहीं किया, यह दिखाने के लिए कि एक ही क्वेरी में योजनाएं क्यों बदल गईं, और इस तथ्य को समझाया कि एक ही क्वेरी के आधार पर विभिन्न योजनाओं का चयन किया जा सकता है उनकी विधेय की चयनात्मकता। उन्होंने यह भी उल्लेख किया कि क्वेरी ऑप्टिमाइज़र टीम इस टूल का उपयोग करती है, जिसे भारतीय विज्ञान संस्थान द्वारा विकसित किया गया था। विज़ुअलाइज़ेशन का एक उदाहरण (विस्तार करने के लिए क्लिक करें):

पिकासो डेटाबेस क्वेरी ऑप्टिमाइज़र विज़ुअलाइज़र

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

एक महत्वपूर्ण तथ्य, मेरी राय में, जिसे कॉनर ने सीधे तौर पर कवर नहीं किया था, वह था संचयी अपडेट (सीयू), सर्विस पैक या संस्करण अपग्रेड में बदलाव के बाद प्रतिगमन के कारण योजनाओं में बदलाव। एक प्रमुख चिंता जो क्वेरी ऑप्टिमाइज़र के अंदर परिवर्तनों के साथ दिमाग में आती है वह है योजना प्रतिगमन। क्वेरी ऑप्टिमाइज़र सुधारों के लिए योजना प्रतिगमन के डर को सबसे बड़ी बाधा माना गया है। रिग्रेशन समस्याएँ हैं जो क्वेरी ऑप्टिमाइज़र पर एक फ़िक्स लागू होने के बाद शुरू की जाती हैं, और कभी-कभी क्लासिक के रूप में संदर्भित होती हैं "दो या दो से अधिक गलतियाँ सही होती हैं।" यह तब हो सकता है, उदाहरण के लिए, दो खराब अनुमान, एक मूल्य को अधिक आंकना और दूसरा इसे कम करके आंकना, एक दूसरे को रद्द करना, सौभाग्य से एक अच्छा अनुमान देना। इनमें से केवल एक मान को ठीक करने से अब एक खराब अनुमान हो सकता है जो योजना चयन की पसंद को नकारात्मक रूप से प्रभावित कर सकता है, जिससे एक प्रतिगमन हो सकता है।

क्वेरी स्टोर क्या करता है?

कॉनर ने उल्लेख किया कि क्वेरी स्टोर प्रदर्शन करता है और निम्नलिखित के साथ मदद कर सकता है:

  1. क्वेरी प्लान के इतिहास को सिस्टम में स्टोर करें;
  2. समय के साथ प्रत्येक क्वेरी योजना के प्रदर्शन को कैप्चर करें;
  3. उन क्वेरी की पहचान करें जो "हाल ही में धीमी हो गई हैं";
  4. आपको योजनाओं को शीघ्रता से लागू करने की अनुमति देता है; और,
  5. सुनिश्चित करें कि यह सर्वर रीस्टार्ट, अपग्रेड और क्वेरी रीकंपाइल पर काम करता है।

इसलिए यह सुविधा न केवल योजनाओं और संबंधित क्वेरी प्रदर्शन जानकारी को संग्रहीत करती है, बल्कि पुरानी क्वेरी योजना को आसानी से लागू करने में भी आपकी मदद कर सकती है, जो कई मामलों में प्रदर्शन समस्या को हल कर सकती है।

क्वेरी स्टोर का उपयोग कैसे करें

आपको ALTER DATABASE CURRENT SET QUERY_STORE = ON; का उपयोग करके क्वेरी स्टोर को सक्षम करने की आवश्यकता है। बयान। मैंने इसे अपनी वर्तमान SQL Azure सदस्यता में आज़माया, लेकिन कथन ने एक त्रुटि लौटा दी क्योंकि ऐसा लगता है कि यह सुविधा अभी तक उपलब्ध नहीं है। मैंने कॉनर से संपर्क किया और उन्होंने मुझे बताया कि यह सुविधा जल्द ही उपलब्ध होगी।

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

आप एकत्र की गई जानकारी का विश्लेषण या तो अपने आवेदन में क्वेरी प्रदर्शन परिवर्तनों को समझने के लिए कर सकते हैं, या यदि आपको कोई प्रदर्शन समस्या है तो पूर्वव्यापी रूप से विश्लेषण कर सकते हैं। एक बार जब आप समस्या की पहचान कर लेते हैं तो आप समस्या को ठीक करने के लिए पारंपरिक क्वेरी ट्यूनिंग तकनीकों का उपयोग कर सकते हैं, या आप sp_query_store_force_plan का उपयोग कर सकते हैं पिछली योजना को लागू करने के लिए संग्रहीत प्रक्रिया। योजना को मजबूर करने के लिए क्वेरी स्टोर में कैप्चर किया जाना है, जिसका स्पष्ट रूप से अर्थ है कि यह एक वैध योजना है (कम से कम जब इसे एकत्र किया गया था; उस पर और बाद में) और इसे पहले क्वेरी ऑप्टिमाइज़र द्वारा उत्पन्न किया गया था। किसी योजना को लागू करने के लिए आपको plan_id . की आवश्यकता होगी , sys.query_store_plan . में उपलब्ध है सूची एक बार जब आप स्टोर किए गए विभिन्न मेट्रिक को देखते हैं, जो बहुत हद तक उसी तरह के होते हैं जैसे कि sys.dm_exec_query_stats में स्टोर किया जाता है। , आप सीपीयू, आई/ओ इत्यादि जैसे विशिष्ट मीट्रिक के लिए अनुकूलित करने का निर्णय ले सकते हैं। फिर आप बस इस तरह के एक कथन का उपयोग कर सकते हैं:

EXEC sys.sp_query_store_force_plan @query_id = 1, @plan_id = 1;

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

क्वेरी स्टोर कैसे काम करता है?

वास्तव में किसी योजना को बाध्य करने के लिए पृष्ठभूमि में योजना मार्गदर्शिकाओं का उपयोग किया जाता है। कॉनर ने उल्लेख किया कि "जब आप एक प्रश्न संकलित करते हैं, तो हम उस कथन से जुड़े XML योजना के टुकड़े के साथ एक USE PLAN संकेत जोड़ते हैं।" इसलिए अब आपको किसी योजना मार्गदर्शिका का उपयोग करने की आवश्यकता नहीं है। यह भी ध्यान रखें कि, योजना गाइड का उपयोग करने के समान, यह गारंटी नहीं है कि वास्तव में मजबूर योजना है लेकिन कम से कम इसके समान कुछ है। योजना मार्गदर्शिकाएँ कैसे काम करती हैं, इसकी याद दिलाने के लिए इस लेख पर एक नज़र डालें। इसके अलावा, आपको इस बात की जानकारी होनी चाहिए कि कुछ ऐसे मामले हैं जहां किसी योजना को बाध्य करना काम नहीं करता है, एक विशिष्ट उदाहरण है जब स्कीमा बदल गया है, अर्थात यदि कोई संग्रहीत योजना किसी अनुक्रमणिका का उपयोग करती है लेकिन अनुक्रमणिका अब मौजूद नहीं है। इस स्थिति में SQL सर्वर योजना को बाध्य नहीं कर सकता, एक सामान्य अनुकूलन करेगा और यह इस तथ्य को रिकॉर्ड करेगा कि जबरन योजना संचालन sys.query_store_plan में विफल रहा। कैटलॉग।

वास्तुकला

हर बार जब SQL सर्वर किसी क्वेरी को संकलित या निष्पादित करता है, तो क्वेरी स्टोर को एक संदेश भेजा जाता है। यह आगे दिखाया गया है।

क्वेरी स्टोर वर्कफ़्लो ओवरव्यू

संकलन और निष्पादन जानकारी को पहले मेमोरी में रखा जाता है और फिर डिस्क पर सहेजा जाता है, जो क्वेरी स्टोर कॉन्फ़िगरेशन पर निर्भर करता है (डेटा INTERVAL_LENGTH_MINUTES के अनुसार एकत्रित किया जाता है) पैरामीटर, जो डिफ़ॉल्ट रूप से एक घंटे तक रहता है, और DATA_FLUSH_INTERVAL_SECONDS के अनुसार डिस्क पर फ़्लश हो जाता है पैरामीटर)। सिस्टम पर मेमोरी प्रेशर होने पर डेटा को डिस्क पर भी फ्लश किया जा सकता है। किसी भी स्थिति में, जब आप sys.query_store_runtime_stats चलाते हैं, तो आप मेमोरी और डिस्क दोनों में सभी डेटा तक पहुंचने में सक्षम होंगे। कैटलॉग।

कैटलॉग

एकत्रित डेटा डिस्क पर बना रहता है और उपयोगकर्ता डेटाबेस में संग्रहीत होता है जहां क्वेरी स्टोर सक्षम होता है (और सेटिंग्स sys.database_query_store_options में संग्रहीत होती हैं। . क्वेरी स्टोर कैटलॉग हैं:

sys.query_store_query_text क्वेरी टेक्स्ट जानकारी
sys.query_store_query क्वेरी टेक्स्ट और SET विकल्पों को प्रभावित करने वाली उपयोग की गई योजना
sys.query_store_plan इतिहास सहित निष्पादन योजनाएं
sys.query_store_runtime_stats क्वेरी रनटाइम आँकड़े
sys.query_store_runtime_stats_interval अंतराल के लिए प्रारंभ और समाप्ति समय
sys.query_context_settings क्वेरी प्रसंग सेटिंग जानकारी

क्वेरी स्टोर दृश्य

रनटाइम आँकड़े औसत, अंतिम, न्यूनतम, अधिकतम और मानक विचलन सहित कई मीट्रिक को कैप्चर करते हैं। यहां sys.query_store_runtime_stats . के लिए कॉलम का पूरा सेट दिया गया है :

runtime_stats_id plan_id runtime_stats_interval_id
execution_type execution_type_desc first_execution_time last_execution_time count_executions
avg_duration last_duration min_duration max_duration stdev_duration
avg_cpu_time last_cpu_time min_cpu_time max_cpu_time stdev_cpu_time
avg_logical_io_reads last_logical_io_reads min_logical_io_reads max_logical_io_reads stdev_logical_io_reads
avg_logical_io_writes last_logical_io_writes min_logical_io_writes max_logical_io_writes stdev_logical_io_writes
avg_physical_io_reads last_physical_io_reads min_physical_io_reads max_physical_io_reads stdev_physical_io_reads
avg_clr_time last_clr_time min_clr_time max_clr_time stdev_clr_time
avg_dop last_dop min_dop max_dop stdev_dop
avg_query_max_used_memory last_query_max_used_memory min_query_max_used_memory max_query_max_used_memory stdev_query_max_used_memory
avg_rowcount last_rowcount min_rowcount max_rowcount stdev_rowcount

sys.query_store_runtime_stats में कॉलम

क्वेरी निष्पादन समाप्त होने पर ही यह डेटा कैप्चर किया जाता है। क्वेरी स्टोर क्वेरी के SET . पर भी विचार करता है विकल्प, जो एक निष्पादन योजना की पसंद को प्रभावित कर सकते हैं, क्योंकि वे अनुकूलन प्रक्रिया के दौरान निरंतर अभिव्यक्तियों के मूल्यांकन के परिणामों जैसी चीजों को प्रभावित करते हैं। मैंने इस विषय को पिछली पोस्ट में कवर किया है।

निष्कर्ष

यह निश्चित रूप से एक महान विशेषता होगी और कुछ ऐसा जो मैं जल्द से जल्द कोशिश करना चाहता हूं (वैसे, कॉनर का डेमो "एसक्यूएल सर्वर 15 सीटीपी 1" दिखाता है लेकिन वे बिट्स सार्वजनिक रूप से उपलब्ध नहीं हैं)। क्वेरी स्टोर अपग्रेड के लिए उपयोगी हो सकता है जो एक सीयू, सर्विस पैक, या SQL सर्वर संस्करण हो सकता है, क्योंकि आप क्वेरी स्टोर द्वारा एकत्र की गई जानकारी का विश्लेषण पहले और बाद में कर सकते हैं यह देखने के लिए कि क्या कोई क्वेरी वापस आ गई है। (और यदि सुविधा निचले संस्करणों में उपलब्ध है, तो आप इसे SKU अपग्रेड परिदृश्य में भी कर सकते हैं।) यह जानने से आपको समस्या के आधार पर कुछ विशिष्ट कार्रवाई करने में मदद मिल सकती है, और उन समाधानों में से एक पिछली योजना को लागू करना हो सकता है। जैसा कि पहले बताया गया है।


  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 सर्वर 2008 लंबवत डेटा क्षैतिज करने के लिए

  2. एसक्यूएल सर्वर ऑलवेजऑन (उपलब्धता समूह) आर्किटेक्चर और स्टेप बाय स्टेप इंस्टालेशन -2

  3. क्या सीटीई, उप-क्वेरी, अस्थायी तालिका या तालिका चर के बीच कोई प्रदर्शन अंतर है?

  4. SQL सर्वर 2014 CTP1 में विभाजन-स्तर ऑनलाइन अनुक्रमणिका संचालन की खोज करना

  5. RStudio को SQL सर्वर से कनेक्ट करना