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
synchronous
oder asynchronous
wie 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_LATENCY
ist 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_LATENCY
konfigurierte 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 AdventureWorks2012
Datenbank auf meiner lokalen Instanz zu erfassen , kann ich die Zieldaten für diese Sitzung anzeigen und feststellen, dass die Abfrage erfasst wurde:
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 STOP
die Sitzung und der Puffer vollständig verteilt. Ich sehe dies, wenn ich meine Sitzung stoppe:
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_MEMORY
Wert 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_buffer
Ziel 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)