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

Azure SQL डेटाबेस के लिए बैंडविड्थ के अनुकूल क्वेरी प्रोफाइलिंग

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

आप हमेशा एकत्रित को पुनः प्राप्त कर सकते हैं सामान्यीकृत . के लिए प्रदर्शन मीट्रिक DMV या क्वेरी स्टोर से क्वेरी, लेकिन उनमें केवल संकलित होता है पैरामीटर और उपरोक्त तत्वों में से कोई भी नहीं। हालांकि यह मददगार है, यह वही नहीं है। उदाहरण के लिए, यदि आपको उस क्वेरी द्वारा उपयोग किए गए विशिष्ट पैरामीटर संयोजन को देखने की आवश्यकता है, जिसने पिछले 24 घंटों में 2 बिलियन बार पढ़ा या शीर्ष CPU-खपत एप्लिकेशन ढूंढा, तो आप भाग्य से बाहर हैं।

Azure SQL डेटाबेस लीगेसी Profiler द्वारा समर्थित नहीं है, और Microsoft ने विश्वसनीयता कारणों से XEvents स्ट्रीमिंग प्रदाता (sys.fn_MSxe_read_event_stream TVF) को अक्षम कर दिया है, इसलिए आप SSMS के साथ XE सत्र और "लाइव डेटा देखें" को स्पिन नहीं कर सकते। Azure पोर्टल में क्वेरी प्रदर्शन अंतर्दृष्टि क्वेरी स्टोर द्वारा समर्थित है, इसलिए आपके पास फिर से केवल सामान्यीकृत क्वेरी और समेकित प्रदर्शन डेटा है, वास्तविक क्वेरी ईवेंट नहीं।

इसलिए, कुछ वर्षों के लिए हम फंस गए थे - Azure SQL डेटाबेस को प्रोफाइल करने का एकमात्र विकल्प मैन्युअल रूप से एक XEvents ट्रेस बनाना था जो एक रिंग बफर या फ़ाइल लक्ष्य को Azure स्टोरेज के साथ लिखता है, जिनमें से कोई भी इष्टतम नहीं है। T-SQL क्वेरी के साथ रिंग बफर का उपयोग करना 4MB स्वरूपित XML सीमा के कारण समस्याग्रस्त हो सकता है, जैसा कि यहां जोनाथन केहैयस द्वारा कवर किया गया है, और फ़ाइल लक्ष्यों के लिए उचित मात्रा में घेरा-कूदना और अतिरिक्त खर्च की आवश्यकता होती है। दोनों को XE डेटा की मैन्युअल क्वेरी की आवश्यकता होती है और इसलिए पारंपरिक अर्थों में बिल्कुल "लाइव" नहीं हैं।

नया दर्ज करें SQL सर्वर प्रोफाइलर

जब मुझे Azure डेटा स्टूडियो के लिए SQL सर्वर प्रोफाइलर एक्सटेंशन के बारे में पता चला तो मुझे यह देखकर प्रसन्नता हुई कि Microsoft अंततः Azure SQL डेटाबेस पर लाइव क्वेरी कैप्चर के लिए एक ग्राफिकल समाधान प्रदान करता है। दुर्भाग्य से, कुछ कारणों से मेरा उत्साह अल्पकालिक था।

सबसे पहले, विरासत प्रोफाइलर से खतरनाक "मानक" ट्रेस का स्पष्ट रूप से Azure SQL डेटाबेस के लिए ADS Profiler XE सत्र के मॉडल के रूप में उपयोग किया गया है , नाम ADS_Standard_Azure डिफ़ॉल्ट रूप से। (पूर्ण SQL सर्वर के लिए उपयोग किए जाने वाले XE सत्र समान हैं।) जैसा कि मैंने कई साल पहले ब्लॉग किया था और अभी भी विश्वास करता हूं, मानक ट्रेस एक प्राथमिक कारण है जो विरासत प्रोफाइलर को इतना खराब माना जाता है। इसमें कई बेकार और फ़िल्टर न करने योग्य ईवेंट शामिल हैं जैसे SQL बैच प्रारंभ , लॉगिन और लॉगआउट , और परिणामस्वरूप यह प्रदर्शन ट्यूनिंग के लिए कोई वास्तविक मूल्य नहीं जोड़ता है। इसके अलावा, लीगेसी प्रोफाइलर द्वारा उपयोग किए जाने वाले सिंक्रोनस रोसेट ट्रेस आर्किटेक्चर के साथ, उच्च इवेंट वॉल्यूम व्यस्त सिस्टम पर प्रदर्शन को प्रभावित कर सकता है। किसी कारण से यह बात दूर नहीं होगी!

विरासत प्रोफाइलर "मानक" ट्रेस इवेंट

ADS प्रोफाइलर “ADS_Standard_Azure” XE इवेंट
– परिचित लग रहे हैं?

दूसरा, यह एक रिंग बफर का उपयोग करता है जिसका अधिकतम आकार 8MB या 1000 ईवेंट है, जो भी पहले हो। क्योंकि लॉगिन/लॉगआउट इवेंट छोटे होते हैं, आप 8एमबी की सीमा, या यहां तक ​​कि 4एमबी स्वरूपित एक्सएमएल सीमा तक पहुंचने से बहुत पहले ही 1000 ईवेंट हिट कर देंगे। हालाँकि, SQL ईवेंट्स के मध्यम मिश्रण के साथ रिंग बफर XML मेरे परीक्षण में 1000 इवेंट्स में अभी भी 2 से 3MB का होगा, और समस्या यह है कि जब भी प्रोफाइलर एक्सटेंशन पोल रीफ्रेश करने के लिए हर बार नेटवर्क पर खींचा जाता है, तो यह पूरा बफर नेटवर्क पर खींचा जाता है। इसका ग्रिड , जो प्रत्येक 1 सेकंड या पिछले मतदान की अवधि से अधिक लंबा है। एक्सएमएल को तब एडीएस प्रोफाइलर एक्सटेंशन द्वारा क्लाइंट-साइड पार्स किया जाता है ताकि यह निर्धारित किया जा सके कि पिछले मतदान के बाद से कौन सी घटनाएं नई हैं, और नई घटनाओं को ग्रिड में जोड़ा जाता है।

एक मामूली व्यस्त सर्वर पर भी रिंग बफर लगभग तुरंत भर जाता है, और इसका शुद्ध प्रभाव यह है कि आप अपने Azure SQL डेटाबेस से पूरे नेटवर्क में>40 मेगाबिट प्रति सेकंड जल्दी से खींच रहे होंगे . इसका अनुवाद 300 मेगाबाइट प्रति मिनट या 18 गीगाबाइट प्रति घंटे होता है!

ADS प्रोफाइलर एक्सटेंशन (4-मिनट की सीमा) से नेटवर्क हिट

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

यद्यपि आप Profiler UI के माध्यम से फ़िल्टर सेट कर सकते हैं जो डेटा की समीक्षा करना आसान बना देगा, यह नेटवर्क हिट को कम नहीं करेगा क्योंकि वे क्लाइंट-साइड संचालित करते हैं।

एक अपडेट किया गया XE सत्र

एडीएस प्रोफाइलर के नेटवर्क बोझ को कम करने और क्वेरी प्रदर्शन ट्यूनिंग के लिए डेटा को अधिक उपभोज्य बनाने का एक त्वरित समाधान ADS_Standard_Azure को अपडेट करना है एक्सई सत्र। नीचे एक स्क्रिप्ट है जो:

  • बेकार की घटनाओं को मिटाएं:

    • sqlserver.attention
    • sqlserver. मौजूदा_कनेक्शन
    • sqlserver.login
    • sqlserver.logout
    • sqlserver.sql_batch_starting
  • शेष घटनाओं पर अवधि की सीमा> 1 सेकंड (1000000 माइक्रोसेकंड) सेट करें:

    • sqlserver.rpc_completed
    • sqlserver.sql_batch_completed
  • रिंग बफर का अधिकतम आकार 1000 से घटाकर 10 इवेंट करें

    • यह मूल ट्रेस के साथ कभी भी काम नहीं करेगा क्योंकि 10 घटनाएं मिलीसेकंड में उत्पन्न होंगी और रिंग बफर बहुत तेज़ी से रीसायकल करेगा जिससे अधिकांश ईवेंट खो जाएंगे। हालांकि, 1-सेकंड अवधि फ़िल्टर के साथ ईवेंट प्रवाह बहुत कम होगा, और 10 ईवेंट्स को ADS Profiler द्वारा उपयोग किए जाने वाले 1-सेकंड के मतदान अंतराल के साथ अच्छी तरह से काम करना चाहिए।
ALTER EVENT SESSION [ADS_Standard_Azure] ON DATABASE 
DROP EVENT sqlserver.attention,
DROP EVENT sqlserver.existing_connection,
DROP EVENT sqlserver.login,
DROP EVENT sqlserver.logout,
DROP EVENT sqlserver.rpc_completed,
DROP EVENT sqlserver.sql_batch_completed,
DROP EVENT sqlserver.sql_batch_starting
GO
 
ALTER EVENT SESSION [ADS_Standard_Azure] ON DATABASE 
ADD EVENT sqlserver.rpc_completed(
ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_pid,sqlserver.database_id,sqlserver.query_hash,sqlserver.session_id,sqlserver.username)
      WHERE (([package0].[equal_boolean]([sqlserver].[is_system],(0))) AND ([duration] >= (1000000)))),
ADD EVENT sqlserver.sql_batch_completed(
ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_pid,sqlserver.database_id,sqlserver.query_hash,sqlserver.session_id,sqlserver.username)
      WHERE (([package0].[equal_boolean]([sqlserver].[is_system],(0))) AND ([duration] >= (1000000))))
GO
 
ALTER EVENT SESSION [ADS_Standard_Azure] ON DATABASE 
DROP TARGET package0.ring_buffer
GO
 
ALTER EVENT SESSION [ADS_Standard_Azure] ON DATABASE 
ADD TARGET package0.ring_buffer(SET max_events_limit=(10),max_memory=(51200))
GO

XE सत्र को अद्यतन करने के लिए स्क्रिप्ट को लागू करने के बाद, फायरहोज तुरंत कम हो जाएगा:

ADS Profiler XE सत्र को अपडेट करने के बाद कम हुआ नेटवर्क हिट

यहां तक ​​कि हल्के वजन के विकल्प

SQL संतरी और उसके SaaS समकक्ष SentryOne मॉनिटर ही एकमात्र अन्य समाधान हैं जिन्हें मैं Azure SQL डेटाबेस से प्रश्नों को कैप्चर करने के लिए जानता हूं, और वे एक अभिनव दृष्टिकोण का उपयोग करके ऐसा करते हैं जो ADS प्रोफाइलर के लिए उपरोक्त अनुकूलित XE सत्र की तुलना में काफी हल्का वजन है। अन्य उन्नत सुविधाओं में, आप क्लाइंट होस्टनाम, एप्लिकेशन और लॉगिन द्वारा आसानी से एकत्र कर सकते हैं, और एकीकृत प्लान एक्सप्लोरर के साथ विश्लेषण के लिए स्वचालित रूप से क्वेरी प्लान कैप्चर कर सकते हैं।

SentryOne मॉनिटर Azure SQL डेटाबेस से कैप्चर की गई क्वेरी और योजनाएँ दिखा रहा है

समापन

Microsoft ने कहा है कि वे ADS Profiler एक्सटेंशन को बढ़ाना जारी रखेंगे, और जब वे ऐसा करेंगे, तो मुझे आशा है कि वे ऊपर उल्लिखित मुद्दों को संबोधित करेंगे। मैंने यहां इस मुद्दे को लॉग किया है। इस बीच, अपडेट की गई स्क्रिप्ट Azure SQL डेटाबेस के लिए एक सुरक्षित और अधिक बैंडविड्थ-अनुकूल क्वेरी प्रोफाइलिंग अनुभव प्रदान करेगी।


  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. कुल फ़ंक्शन COUNT के साथ रिकॉर्ड्स को कैसे फ़िल्टर करें?

  3. SQL डेवलपर में सीक्वेंस ट्रिगर से PK बनाने का तरीका जानें

  4. टेबल एक्सप्रेशन के फंडामेंटल, भाग 12 - इनलाइन टेबल-वैल्यूड फंक्शन्स

  5. आंकड़े अपडेट के लिए संभावित सुधार :MAXDOP