कैविएट : नीचे दी गई अधिकांश जानकारी मैंने जोनाथन कीहियास द्वारा दो प्लुरलिट पाठ्यक्रम से गुजरने से कड़ाई से सीखी । अच्छी तरह से प्लस सदस्यता के लिए एक महीने के खर्च के लायक अपने दो पाठ्यक्रमों के माध्यम से जाने के लिए।
सबसे पहले ब्याज के कुछ बिंदु जो मुझे लगता है कि मदद करेगा (या अधिकांश ब्याज पर):
- जब एक विस्तारित ईवेंट सत्र प्रारंभ किया जाता है, तो इसमें सत्र की घटनाओं द्वारा उत्पन्न डेटा को संग्रहीत करने के लिए बफर स्पेस के लिए आवंटित मेमोरी का एक हिस्सा होगा। आपके सत्र में यह 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)