Visualisierung von SQL Server Extended Events-Daten

16

In letzter Zeit habe ich die Verwendung von Extended Events in SQL Server untersucht, um verschiedene Abfragen zu vergleichen und zu optimieren. Bisher habe ich zum Anzeigen der Ereignisdaten die Funktion "Live-Daten anzeigen" in SSMS verwendet.

Das Problem, das ich habe, ist, dass es scheint, dass die Live Events-Funktion einen internen Puffer verwendet, was bedeutet, dass ich manchmal eine Abfrage mehrmals ausführen muss, damit die Informationen im Fenster angezeigt werden. Ich habe daher eine zweiteilige Frage zu stellen:

  1. Gibt es eine Möglichkeit, diese Verzögerung zu umgehen, wenn Ereignisse im Live-Feed angezeigt werden? (Ich mache dies auf einer lokalen Datenbank, damit die Leistung kein Problem darstellt.)
  2. Ist der Live-Feed die beste Möglichkeit, Extended Events-Daten zu visualisieren? Gibt es ein anderes Tool in SSMS oder nicht, das besser an meinen Anwendungsfall angepasst ist?

AKTUALISIEREN

Wie gewünscht, ist hier die Sitzung:

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
Levi Botelho
quelle

Antworten:

15

Vorsichtsmaßnahme : Viele der unten aufgeführten Informationen stammen aus zwei Pluralsight-Kursen von Jonathan Keyhayias . Es lohnt sich die einmonatige Ausgabe für das Plus-Abonnement, um seine beiden Kurse zu durchlaufen.

Zunächst ein paar Punkte von Interesse, von denen ich denke, dass sie helfen (oder höchstens von Interesse sind):

  • Wenn eine erweiterte Ereignissitzung gestartet wird, wird ein Teil des Speichers einem Pufferbereich zum Speichern von Daten zugewiesen, die durch die Ereignisse der Sitzung generiert wurden. In Ihrer Sitzung ist dies der Standardwert von 4 MB
  • Es stehen mehrere Ziele zur Verfügung. Diese Ziele sind entweder synchronousoder asynchronouswie sie Daten empfangen. Die beiden am häufigsten verwendeten Ziele, Zieldatei und Ringpuffer, sind beide asynchron. In diesem BOL-Artikel wird angegeben, welcher Typ jedes Ziel ist .
  • Dies MAX_DISPATCH_LATENCYist eine Konfigurationsoption, die steuert, wann Ereignisdaten an die Ziele gesendet werden. Das Dispatching erfolgt nur für asynchrone Ziele. Es gibt zwei Bedingungen, unter denen Ereignisdaten ausgelöst werden: (1) Der Speicherpuffer für die Sitzung ist voll oder (2) Die Ereignisdaten im Puffer überschreiten die MAX_DISPATCH_LATENCYkonfigurierte Option der Sitzung .
  • Wenn Sie den Live Data Viewer öffnen, wird der Ereignissitzung ein zusätzliches Ziel mit dem Namen "Streaming-Ziel" hinzugefügt. Dieser empfängt den Live-Ereignisstrom, wenn Speicherpuffer gesendet werden. Tatsächlich wird auch die mit der Sitzung verbundene Versandlatenz auf 3 Sekunden geändert, um eine Echtzeitansicht der Sitzung zu erhalten.

Nun zu bestimmten Punkten in Ihrer Frage:

Das Problem, das ich habe, ist, dass es scheint, dass die Live Events-Funktion einen internen Puffer verwendet, was bedeutet, dass ich manchmal eine Abfrage mehrmals ausführen muss, damit die Informationen im Fenster angezeigt werden. Ich habe daher eine zweiteilige Frage zu stellen

Mir ist nicht bewusst, dass dies anders ist als das, was ich oben angegeben habe. Ich würde davon ausgehen, dass das erfasste Ereignis nicht die Schwellenwerte erfüllt, die für den Versand an Ihren Live-Daten-Viewer erforderlich sind. Ich habe dies mit folgender Abfrage getestet AdventureWorks2012:

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

Mit der Konfiguration Ihrer Ereignissitzung, mit der Ausnahme, dass ich filtere, um nur Daten für die AdventureWorks2012Datenbank auf meiner lokalen Instanz zu erfassen , kann ich die Zieldaten für diese Sitzung anzeigen und feststellen, dass die Abfrage erfasst wurde:

Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben

Wenn Sie diese Abfrage ein weiteres Mal ausführen, wird sie schließlich ausgelöst und der Daten-Viewer zeigt ein Ereignis an. Wenn Sie nun alle angezeigten Ereignisse anzeigen möchten, werden STOPdie Sitzung und der Puffer vollständig verteilt. Ich sehe dies, wenn ich meine Sitzung stoppe:

Bildbeschreibung hier eingeben

1. Gibt es eine Möglichkeit, diese Verzögerung zu umgehen, damit die Ereignisse im Live-Feed angezeigt werden? (Ich mache dies auf einer lokalen Datenbank, damit die Leistung kein Problem darstellt.)

Ich hatte gedacht, Sie könnten den MAX_MEMORYWert auf einen niedrigeren Wert ändern, der eine kleine Puffergröße zum Erfassen von Ereignissen anzeigt. Der niedrigste Wert, den Sie in SQL Server 2012 festlegen können, ist jedoch 200KB, dass die von mir verwendete Abfrage diese Grenze nicht einhält, damit sie sofort versendet wird. Ich konnte höchstens eine Abfrage ausführen, die dazu führte, dass der Puffer erreicht und die zuvor erfassten Ereignisse ausgelöst wurden:

SELECT *
FROM Person.Person
ORDER BY EmailPromotion DESC;

2.Ist der Live-Feed die beste Möglichkeit, Extended Events-Daten zu visualisieren? Gibt es ein anderes Tool in SSMS oder nicht, das besser an meinen Anwendungsfall angepasst ist?

Nicht, dass mir das momentan bewusst wäre. Ich würde vorschlagen, dass die beste Methode zum Herausholen von Daten, sobald sie auftreten, darin besteht, das XML-Format nach dem ring_bufferZiel abzufragen und es einfach herauszuschneiden. Ich kann das obige Beispiel wiederholen und sobald ich die folgende Abfrage durchführe, sehe ich das Ereignis.

-- 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)

Bildbeschreibung hier eingeben

Shawn Melton
quelle
3
Tolle Antwort, sehr detailliert. Einziger Punkt, und es ist mehr von Interesse als jede echte Diskussion; Sie haben Johnathan Kehayias erwähnt, und ich stimme zu, dass seine Pluralsight-Kurse die 1-Monats-Gebühr zu 100% wert sind. Er hat jedoch einen Blog, in dem er darüber spricht, wie er das Ringpuffer-Ziel hasst . Es war aus dem Jahr 2014, also hat sich das vielleicht geändert, aber es war eine interessante Lektüre: sqlskills.com/blogs/jonathan/…
Kalmino
1

.Net 4.7.2 hat einen Fix, um die anfängliche Verzögerung für die Ereignisanzeige bei Verwendung des Live-Ziels zu verringern.

David Shiflet
quelle
2
Könnten Sie eine Referenz angeben, um Ihre Antwort zu unterstützen? Derzeit enthält Ihre Antwort nicht viel zu tun.
John aka hot2use