การแสดงข้อมูลเหตุการณ์ที่ขยายของเซิร์ฟเวอร์ SQL


16

เมื่อเร็ว ๆ นี้ฉันได้สำรวจโดยใช้ Extended Events ใน SQL Server เพื่อช่วยฉันเปรียบเทียบและเพิ่มประสิทธิภาพการค้นหาต่างๆ จนถึงตอนนี้เพื่อดูข้อมูลเหตุการณ์ที่ฉันใช้คุณลักษณะ "ดูข้อมูลสด" ใน SSMS

ปัญหาที่ฉันพบคือปรากฏว่าฟีเจอร์ Live Events ใช้บัฟเฟอร์ภายในซึ่งหมายความว่าบางครั้งฉันต้องเรียกใช้แบบสอบถามหลายครั้งเพื่อรับข้อมูลเพื่อแสดงในหน้าต่าง ฉันจึงมีคำถามสองส่วนที่จะถาม:

  1. มีวิธีใดที่จะหลีกเลี่ยงความล่าช้านี้ในการรับเหตุการณ์ที่จะแสดงในฟีดสดหรือไม่? (ฉันกำลังทำสิ่งนี้ในฐานข้อมูลท้องถิ่นดังนั้นประสิทธิภาพจึงไม่เป็นปัญหา)
  2. ฟีดข้อมูลสดเป็นวิธีที่ดีที่สุดในการแสดงภาพข้อมูลกิจกรรมเพิ่มเติมหรือไม่ มีเครื่องมืออื่นใน SSMS หรือไม่ที่ปรับให้เข้ากับกรณีการใช้งานของฉันได้ดีขึ้น?

UPDATE

ตามที่ร้องขอนี่คือเซสชัน:

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

ข้อแม้ : มากของข้อมูลที่ให้ไว้ด้านล่างผมได้เรียนรู้อย่างเคร่งครัดจะผ่านจากสองหลักสูตร 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)

ป้อนคำอธิบายรูปภาพที่นี่


3
คำตอบที่ดีมีรายละเอียดมาก ชี้เฉพาะและเป็นเรื่องที่น่าสนใจมากกว่าการสนทนาจริงใด ๆ คุณพูดถึง Johnathan Kehayias และฉันเห็นด้วยหลักสูตร Pluralsight ของเขามีค่า 100% สำหรับค่าบริการ 1 เดือน อย่างไรก็ตามเขามีบล็อกที่เขาพูดถึงว่าเขาเกลียดเป้าหมาย Ring Buffer อย่างไร มันมาจากปี 2014 ดังนั้นอาจมีการเปลี่ยนแปลงในขณะนี้ แต่เป็นการอ่านที่น่าสนใจ: sqlskills.com/blogs/jonathan/ …
Kalmino

1

.Net 4.7.2 มีการแก้ไขเพื่อลดความล่าช้าเริ่มต้นสำหรับการแสดงเหตุการณ์เมื่อใช้เป้าหมายสด


2
คุณสามารถให้การอ้างอิงเพื่อสนับสนุนคำตอบของคุณ? ขณะนี้คำตอบของคุณยังไม่มีอะไรให้ทำมากมายนัก
John aka hot2use
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.