SQL सर्वर विस्तारित इवेंट डेटा विज़ुअलाइज़िंग


16

हाल ही में मैं एसक्यूएल सर्वर में विस्तारित घटनाओं का उपयोग करके मुझे बेंचमार्क और विभिन्न प्रश्नों का अनुकूलन करने में मदद कर रहा हूं। अब तक, SSMS में "वॉच लाइव डेटा" सुविधा का उपयोग करने वाले इवेंट डेटा को देखने के लिए।

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

  1. क्या लाइव फ़ीड में प्रदर्शित होने की घटनाओं को प्राप्त करने में इस देरी के आसपास एक रास्ता है? (मैं एक स्थानीय डेटाबेस पर ऐसा कर रहा हूं इसलिए प्रदर्शन कोई मुद्दा नहीं है)
  2. क्या विस्तारित इवेंट डेटा की कल्पना करने का सबसे अच्छा तरीका लाइव फ़ीड है? क्या एसएसएमएस में कोई दूसरा उपकरण है या नहीं जो मेरे उपयोग के मामले में बेहतर रूप से अनुकूलित है?

अपडेट करें

अनुरोध के अनुसार, यहां सत्र है:

CREATE EVENT SESSION [Simple Query Benchmarking] ON SERVER 
ADD EVENT sqlserver.sql_batch_completed(SET collect_batch_text=(1)
    ACTION(sqlserver.query_hash,sqlserver.query_plan_hash,sqlserver.sql_text)
    WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0)) AND [package0].[greater_than_uint64]([duration],(1000)))) 
ADD TARGET package0.ring_buffer
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=1 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=ON,STARTUP_STATE=OFF)
GO

जवाबों:


15

कैविएट : नीचे दी गई अधिकांश जानकारी मैंने जोनाथन कीहियास द्वारा दो प्लुरलिट पाठ्यक्रम से गुजरने से कड़ाई से सीखी । अच्छी तरह से प्लस सदस्यता के लिए एक महीने के खर्च के लायक अपने दो पाठ्यक्रमों के माध्यम से जाने के लिए।

सबसे पहले ब्याज के कुछ बिंदु जो मुझे लगता है कि मदद करेगा (या अधिकांश ब्याज पर):

  • जब एक विस्तारित ईवेंट सत्र प्रारंभ किया जाता है, तो इसमें सत्र की घटनाओं द्वारा उत्पन्न डेटा को संग्रहीत करने के लिए बफर स्पेस के लिए आवंटित मेमोरी का एक हिस्सा होगा। आपके सत्र में यह 4MB के डिफ़ॉल्ट मान पर सेट है
  • उपयोग करने के लिए कई लक्ष्य उपलब्ध हैं। ये लक्ष्य synchronousया तो हैं या asynchronousवे कैसे डेटा प्राप्त करते हैं। टारगेट फाइल और रिंग बफ़र के दो सबसे अधिक इस्तेमाल किए जाने वाले लक्ष्य दोनों अतुल्यकालिक हैं। BOL लेख यहाँ इंगित करता है कि प्रत्येक लक्ष्य किस प्रकार का है
  • MAX_DISPATCH_LATENCYएक विन्यास विकल्प है कि नियंत्रण इवेंट डेटा लक्ष्य (लक्ष्यों) भेजा जाता है जब है। डिस्पैचिंग केवल अतुल्यकालिक लक्ष्यों के लिए होती है। ऐसी दो स्थितियाँ हैं जिनके कारण ईवेंट डेटा भेजा जाएगा: (1) सत्र के लिए मेमोरी बफ़र पूर्ण है या (2) बफ़र में इवेंट डेटा सत्र के MAX_DISPATCH_LATENCYकॉन्फ़िगर किए गए विकल्प से अधिक है।
  • जब आप लाइव डेटा व्यूअर खोलते हैं, तो यह इवेंट सत्र के लिए एक अतिरिक्त लक्ष्य संलग्न करेगा जिसे "स्ट्रीमिंग लक्ष्य" कहा जाता है। यह लाइव इवेंट स्ट्रीम प्राप्त करेगा क्योंकि मेमोरी बफ़र्स भेजे जा रहे हैं। यह वास्तव में सत्र के वास्तविक समय को देखने के लिए सत्र के साथ जुड़े प्रेषण विलंब को 3 सेकंड में बदल देगा।

अब आपके प्रश्न के विशिष्ट बिंदु:

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

मुझे इस बात की जानकारी नहीं है कि यह मेरे द्वारा बताई गई बातों से इतर है। मुझे उम्मीद है कि इस घटना पर कब्जा कर लिया गया था यह सिर्फ आपके लाइव डेटा व्यूअर को भेजने के लिए आवश्यक थ्रेसहोल्ड को पूरा नहीं करता है। मैंने निम्न क्वेरी से इसका परीक्षण किया AdventureWorks2012:

SELECT * FROM dbo.ErrorLog
WAITFOR DELAY '00:00:01' ;
GO

अपने इवेंट सत्र कॉन्फ़िगरेशन का उपयोग करते हुए, इस अपवाद के साथ कि मैं AdventureWorks2012अपने स्थानीय उदाहरण पर डेटाबेस के लिए केवल डेटा कैप्चर करने के लिए फ़िल्टर कर रहा हूं, मैं इस सत्र के लिए लक्ष्य डेटा देख सकता हूं और पा सकता हूं कि क्वेरी कैप्चर की गई थी:

यहाँ छवि विवरण दर्ज करें यहाँ छवि विवरण दर्ज करें

इस क्वेरी को एक बार और निष्पादित करने से अंत में इसे प्रेषण के लिए लाया जाएगा और डेटा दर्शक एक घटना को प्रदर्शित करता है। अब यदि आप वास्तव में उन सभी घटनाओं को देखना चाहते हैं जो केवल STOPसत्र और बफ़र प्रदर्शित हैं तो पूरी तरह से प्रेषण हो जाएगा। अपना सत्र रोकने के बाद मैं इसे देखता हूं:

यहाँ छवि विवरण दर्ज करें

1. क्या लाइव फ़ीड में प्रदर्शित होने की घटनाओं को प्राप्त करने में इस देरी के आसपास एक रास्ता है? (मैं एक स्थानीय डेटाबेस पर ऐसा कर रहा हूं इसलिए प्रदर्शन कोई मुद्दा नहीं है)

मैंने सोचा था कि आप MAX_MEMORYकम मूल्य में बदल सकते हैं जो घटनाओं को पकड़ने के लिए एक छोटे बफर आकार का संकेत देगा। हालाँकि आप इसे SQL सर्वर 2012 में सबसे कम मान सेट कर सकते हैं 200KB, जो मैंने उपयोग किया है वह क्वेरी उस सीमा को पूरा नहीं करती है जिससे इसे तुरंत भेजा जा सके। केवल एक चीज जो मैं कर सकता था, वह एक क्वेरी को निष्पादित करने के लिए थी जो बफर तक पहुंचने का कारण बनेगी और पिछली घटनाओं को प्रेषित किया जाएगा:

SELECT *
FROM Person.Person
ORDER BY EmailPromotion DESC;

2. क्या मैं विस्तारित इवेंट डेटा की कल्पना करने का सबसे अच्छा तरीका है? क्या एसएसएमएस में कोई दूसरा उपकरण है या नहीं जो मेरे उपयोग के मामले में बेहतर रूप से अनुकूलित है?

ऐसा नहीं है कि मैं वर्तमान में जागरूक हूं। मैं सुझाव देता हूं कि जैसे ही यह होता है कि डेटा को प्राप्त करने का सबसे अच्छा तरीका एक्सएमएल को ring_bufferलक्ष्य के लिए क्वेरी करना है और बस इसे बाहर निकालना है। मैं उपरोक्त उदाहरण दोहरा सकता हूं और जैसे ही मैं नीचे दिए गए क्वेरी को निष्पादित करता हूं, मुझे घटना दिखाई देती है।

-- Create XML variable to hold Target Data
DECLARE @target_data XML
SELECT  @target_data = CAST([t].[target_data] AS XML)
FROM    [sys].[dm_xe_sessions] AS s
JOIN    [sys].[dm_xe_session_targets] AS t
        ON [t].[event_session_address] = [s].[address]
WHERE   [s].[name] = N'Simple Query Benchmarking' AND
        [t].[target_name] = N'ring_buffer' ;

-- Return the full XML document
--SELECT @target_data;

--Shred XMl to get needed data
SELECT  DATEADD(hh, DATEDIFF(hh, GETUTCDATE(), CURRENT_TIMESTAMP), n.value('(@timestamp)[1]', 'datetime2')) AS [timestamp],
    n.value('(data[@name="duration"]/value)[1]', 'bigint') as duration,
    n.value('(action[@name="sql_text"]/value)[1]', 'varchar(max)') as sql_text
FROM @target_data.nodes('RingBufferTarget/event[@name=''sql_batch_completed'']') AS q(n)

यहाँ छवि विवरण दर्ज करें


3
शानदार जवाब, बहुत विस्तृत। केवल बिंदु, और यह किसी भी वास्तविक चर्चा से अधिक रुचि है; आपने जॉनाथन केहियास का उल्लेख किया और, मैं मानता हूं, उनके प्लुरलसाइट पाठ्यक्रम 1 महीने के शुल्क के 100% हैं। हालाँकि, उनके पास एक ब्लॉग है जहाँ वह बात करते हैं कि वह रिंग बफ़र लक्ष्य से कैसे नफरत करते हैं। यह 2014 से था, इसलिए शायद अब यह बदल गया है, लेकिन यह एक दिलचस्प पढ़ा गया: sqlskills.com/blogs/jonathan/…
Kalmino

1

.नेट 4.7.2 में लाइव टारगेट का उपयोग करते समय इवेंट डिस्प्ले के लिए शुरुआती देरी को कम करने के लिए एक फिक्स है।


2
क्या आप अपने जवाब का समर्थन करने के लिए एक संदर्भ प्रदान कर सकते हैं? वर्तमान में आपके उत्तर में बहुत कुछ नहीं है।
जॉन उर्फ ​​हॉट 2 फ्यूज़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.