Freigeben über


Erstellen einer Sitzung mit einem ring_buffer-Ziel im Arbeitsspeicher

Gilt für: Azure SQL-Datenbank Azure SQL Managed Instance SQL-Datenbank in Fabric

Die allgemeinen Schritte in dieser exemplarischen Vorgehensweise sind:

  1. Erstellen und Starten einer Ereignissitzung mit einem ring_buffer-Ziel
  2. Anzeigen erfasster Ereignisdaten als XML
  3. Anzeigen erfasster Ereignisdaten als relationales Rowset

Mit dem ring_buffer-Ziel sind die Schritte einfacher als mit dem event_file-Ziel, da Sie keine Ereignisdaten in Azure Storage speichern müssen. Die Abschnitte dieses Artikels zu Azure SQL-Datenbank sind auch für Fabric SQL-Datenbank relevant.

Erstellen und Starten einer Ereignissitzung mit einem ring_buffer-Ziel

Um eine neue Ereignissitzung in SQL Server Management Studio (SSMS) zu erstellen, erweitern Sie dieselbe Datenbank in Objekt-Explorer, und erweitern Sie dann Erweiterte Ereignisse. Dieser Knoten befindet sich unter dem Datenbankordner in Azure SQL-Datenbank und unter dem Verwaltungsordner in Azure SQL Managed Instance. Klicken Sie mit der rechten Maustaste auf den Ordner Sitzungen, und wählen Sie Neue Sitzung… aus. Geben Sie auf der Seite Allgemein einen Namen für die Sitzung ein, die sich in diesem Beispiel example-session befindet. Wählen Sie auf der Seite Ereignisse ein oder mehrere Ereignisse aus, die der Sitzung hinzugefügt werden sollen. In diesem Beispiel wählen wir das Ereignis sql_batch_starting aus.

Screenshot des Dialogfelds „Neue Sitzungs-SSMS“ mit der Seite „Ereignisauswahl“ mit ausgewähltem sql_batch_starting Ereignis.

Wählen Sie ring_buffer auf der Seite Datenspeicher als Zieltyp aus. Um Arbeitsspeicher zu sparen, wird empfohlen, die Anzahl der Ereignisse auf eine kleine Zahl (standardmäßig 1.000) zu beschränken und den maximalen Pufferspeicher auf 1 MB oder weniger festzulegen. Ausführliche Informationen finden Sie unter ring_buffer-Ziel.

Screenshot des Dialogfelds „Neue Sitzungs-SSMS“ mit der Seite „Datenspeicherauswahl“ mit ausgewähltem ring_buffer-Ziel.

Nachdem die Sitzung konfiguriert ist, können Sie optional die Schaltfläche Skript auswählen, um ein T-SQL-Skript der Sitzung zu erstellen, um sie für später zu speichern. Hier ist das Skript für unsere Beispielsitzung:

CREATE EVENT SESSION [example-session] ON DATABASE
ADD EVENT sqlserver.sql_batch_starting
ADD TARGET package0.ring_buffer(SET max_memory=(1024))
GO

Wählen Sie OK aus, um die Sitzung zu erstellen.

Anzeigen von Sitzungsdaten als XML

Erweitern Sie in Objekt-Explorer den Ordner Sitzungen, um die von Ihnen erstellte Ereignissitzung anzuzeigen. Standardmäßig wird die Sitzung beim Erstellen nicht gestartet. Um die Sitzung zu starten, klicken Sie mit der rechten Maustaste auf den Sitzungsnamen, und wählen Sie Sitzung starten aus. Sie können sie später beenden, indem Sie auf ähnliche Weise Sitzung beenden auswählen, sobald die Sitzung ausgeführt wird.

Während T-SQL-Batches in dieser Datenbank ausgeführt werden, schreibt die Sitzung Ereignisse in einen Speicherpuffer. Da die Größe des Speicherpuffers endlich ist, werden die älteren Ereignisse gelöscht, um Platz für neuere Ereignisse zu schaffen.

Erweitern Sie in Objekt-Explorer die Sitzung, um das package0.ring_buffer-Ziel anzuzeigen, und doppelklicken Sie auf das Ziel. Sie können auch mit der rechten Maustaste klicken und Zieldaten anzeigen... auswählen. Dadurch wird ein Raster geöffnet, in dem ein XML-Fragment angezeigt wird. Wählen Sie dieses XML-Fragment aus, um ein XML-Dokument anzuzeigen, das den Speicherpufferinhalt darstellt.

In der ersten Zeile des XML-Dokuments werden Sitzungs- und Zielmetadaten beschrieben:

<RingBufferTarget truncated="0" processingTime="0" totalEventsProcessed="17" eventCount="17" droppedCount="0" memoryUsed="32070">

In diesem Beispiel sehen wir, dass 17 Ereignisse vom ring_buffer-Ziel verarbeitet wurden. Es wurden keine Ereignisse verworfen, da der Pufferspeicher nicht erschöpft war und die maximale Anzahl von Ereignissen, die wir konfiguriert haben (1.000), nicht erreicht wurde.

Tipp

Achten Sie auf das truncated-Attribut. Wenn es auf 1 festgelegt ist, bedeutet dies, dass die XML-Darstellung des Speicherpuffers nicht den gesamten Pufferinhalt anzeigt. Weitere Informationen finden Sie unter ring_buffer-Ziel.

Der Rest des XML-Dokuments enthält Ereignisse. Eine Darstellung eines einzelnen Ereignisses in XML kann wie folgt aussehen:

  <event name="sql_batch_starting" package="sqlserver" timestamp="2023-10-18T17:43:34.079Z">
    <data name="batch_text">
      <type name="unicode_string" package="package0"></type>
      <value><![CDATA[SELECT
'DatabaseXEStore[@Name=' + quotename(CAST(db_name() AS sysname),'''') +' and @ServerName=' + quotename(CAST(SERVERPROPERTY('servername') AS sysname),'''') + ']' AS [Urn],
CAST(db_name() AS sysname) AS [Name],
CAST(SERVERPROPERTY('servername') AS sysname) AS [ServerName],
(SELECT count(*) FROM sys.dm_xe_database_sessions) AS [RunningSessionCount]]]></value>
    </data>
  </event>

Hier enthält das value-Attribut den T-SQL-Batch (eine einzelne Abfrage in diesem Beispiel).

Anzeigen von Sitzungsdaten als relationales Rowset

Um Ereignisdaten aus einem ring_buffer-Ziel in einem relationalen Rowset anzuzeigen, müssen Sie eine T-SQL-Abfrage schreiben, die XQuery-Ausdrücke zum Konvertieren von XML in relationale Daten verwendet.

Hier ist ein Beispiel für die von uns erstellte Sitzung, in der die neuesten Ereignisse zuerst angezeigt werden:

WITH
/* An XML document representing memory buffer contents */
RingBuffer AS
(
SELECT CAST(xst.target_data AS xml) AS TargetData
FROM sys.dm_xe_database_session_targets AS xst
INNER JOIN sys.dm_xe_database_sessions AS xs
ON xst.event_session_address = xs.address
WHERE xs.name = N'example-session'
),
/* A row for each event in the buffer, represented as an XML fragment */
EventNode AS
(
SELECT CAST(NodeData.query('.') AS xml) AS EventInfo
FROM RingBuffer AS rb
CROSS APPLY rb.TargetData.nodes('/RingBufferTarget/event') AS n(NodeData)
)
/* A relational rowset formed by using the XQuery value method */
SELECT EventInfo.value('(event/@timestamp)[1]','datetimeoffset') AS timestamp,
       EventInfo.value('(event/@name)[1]','sysname') AS event_name,
       EventInfo.value('(event/data/value)[1]','nvarchar(max)') AS sql_batch_text
FROM EventNode
ORDER BY timestamp DESC;