ข้อแม้ : มากของข้อมูลที่ให้ไว้ด้านล่างผมได้เรียนรู้อย่างเคร่งครัดจะผ่านจากสองหลักสูตร Pluralsight โดยโจนาธาน Keyhayias คุ้มค่ากับค่าใช้จ่ายหนึ่งเดือนสำหรับการสมัครสมาชิกบวกเพื่อผ่านสองหลักสูตรของเขา
ก่อนอื่นเพียงไม่กี่จุดที่น่าสนใจที่ฉันคิดว่าจะช่วย (หรือที่น่าสนใจที่สุด):
- เมื่อเริ่มเซสชันเพิ่มเติมเหตุการณ์นั้นจะมีส่วนของหน่วยความจำที่จัดสรรให้กับพื้นที่บัฟเฟอร์เพื่อเก็บข้อมูลที่สร้างขึ้นโดยเหตุการณ์ของเซสชัน ในเซสชั่นของคุณนี้ถูกตั้งค่าเป็นค่าเริ่มต้นของ 4MB
- มีหลายเป้าหมายให้ใช้ เป้าหมายเหล่านี้เป็นวิธีการ
synchronous
หรือasynchronous
รับข้อมูล เป้าหมายที่ใช้กันมากที่สุดสองรายการคือ Target File และ Ring Buffer มีทั้งแบบอะซิงโครนัส บทความ BOL นี่แสดงให้เห็นว่าสิ่งที่พิมพ์แต่ละเป้าหมายคือ
MAX_DISPATCH_LATENCY
เป็นตัวเลือกการกำหนดค่าที่ควบคุมเมื่อข้อมูลที่เป็นเหตุการณ์ที่ถูกส่งไปยังเป้าหมาย (s) Dispatching เกิดขึ้นสำหรับเป้าหมายแบบอะซิงโครนัสเท่านั้น มีสองเงื่อนไขที่จะทำให้ข้อมูลเหตุการณ์ถูกส่ง: (1) บัฟเฟอร์หน่วยความจำสำหรับเซสชันเต็มหรือ (2) ข้อมูลเหตุการณ์ในบัฟเฟอร์เกินMAX_DISPATCH_LATENCY
ตัวเลือกที่กำหนดค่าของเซสชัน
- เมื่อคุณเปิด Live Data Viewer มันจะแนบเป้าหมายเพิ่มเติมไปยังเซสชันเหตุการณ์ที่เรียกว่า "สตรีมมิ่งเป้าหมาย" สิ่งนี้จะได้รับสตรีมเหตุการณ์สดในขณะที่บัฟเฟอร์หน่วยความจำกำลังถูกส่งไป จริง ๆ แล้วมันจะเปลี่ยนเวลาแฝงการจัดส่งที่เกี่ยวข้องกับเซสชั่นเป็น 3 วินาทีเพื่อให้ได้รับมุมมองเรียลไทม์ของเซสชั่น
ตอนนี้ถึงจุดเฉพาะในคำถามของคุณ:
ปัญหาที่ฉันพบคือปรากฏว่าฟีเจอร์ Live Events ใช้บัฟเฟอร์ภายในซึ่งหมายความว่าบางครั้งฉันต้องเรียกใช้แบบสอบถามหลายครั้งเพื่อรับข้อมูลเพื่อแสดงในหน้าต่าง ฉันมีคำถามสองส่วนที่จะถาม
ฉันไม่ทราบว่าจะทำอย่างอื่นนอกเหนือจากที่ฉันได้กล่าวไว้ข้างต้น ฉันคาดหวังว่าเหตุการณ์จะถูกบันทึกไว้เพียงแค่ไม่ตรงตามเกณฑ์ที่กำหนดเพื่อให้ส่งไปยังโปรแกรมดูข้อมูลสดของคุณ ฉันทดสอบกับแบบสอบถามต่อไปนี้จากAdventureWorks2012
:
SELECT * FROM dbo.ErrorLog
WAITFOR DELAY '00:00:01' ;
GO
การใช้การกำหนดค่าเซสชันเหตุการณ์ของคุณด้วยข้อยกเว้นที่ฉันกรองเพื่อจับข้อมูลเฉพาะสำหรับAdventureWorks2012
ฐานข้อมูลบนอินสแตนซ์ในพื้นที่ของฉันฉันสามารถดูข้อมูลเป้าหมายสำหรับเซสชันนี้และค้นหาการสืบค้นได้:
ในการดำเนินการค้นหานี้อีกครั้งในที่สุดก็จะทำให้มันได้รับการจัดส่งและดูข้อมูลแสดงเหตุการณ์หนึ่ง ตอนนี้ถ้าคุณต้องการที่จะเห็นเหตุการณ์ทั้งหมดที่แสดงเพียงแค่STOP
เซสชั่นและบัฟเฟอร์จะได้รับการจัดส่งอย่างเต็มที่ ฉันเห็นสิ่งนี้เมื่อฉันหยุดเซสชันของฉัน:
1. มีวิธีใดบ้างที่จะหลีกเลี่ยงความล่าช้านี้ในการรับเหตุการณ์ที่จะแสดงในฟีดสด (ฉันกำลังทำสิ่งนี้ในฐานข้อมูลท้องถิ่นดังนั้นประสิทธิภาพจึงไม่เป็นปัญหา)
ฉันคิดว่าคุณสามารถเปลี่ยนMAX_MEMORY
เป็นค่าต่ำกว่าซึ่งจะระบุขนาดบัฟเฟอร์เล็ก ๆ เพื่อจับภาพเหตุการณ์ อย่างไรก็ตามค่าต่ำสุดที่คุณสามารถตั้งค่านี้ใน SQL Server 2012 คือ200KB
ซึ่งแบบสอบถามที่ฉันใช้ไม่เป็นไปตามข้อ จำกัด ดังกล่าวเพื่อให้ถูกส่งทันที สิ่งเดียวที่ฉันทำได้คือเรียกใช้คิวรีที่ทำให้บัฟเฟอร์เข้าถึงได้และกิจกรรมก่อนหน้านี้ที่จะทำการส่ง:
SELECT *
FROM Person.Person
ORDER BY EmailPromotion DESC;
2. ฟีดข้อมูลสดเป็นวิธีที่ดีที่สุดในการมองเห็นข้อมูลเหตุการณ์เพิ่มเติมได้หรือไม่ มีเครื่องมืออื่นใน SSMS หรือไม่ที่ปรับให้เข้ากับกรณีการใช้งานของฉันได้ดีขึ้น?
ไม่ว่าตอนนี้ฉันรู้แล้ว ฉันจะแนะนำวิธีที่ดีที่สุดในการดึงข้อมูลออกมาทันทีที่เกิดขึ้นคือการค้นหา XML สำหรับ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)