Een gebeurtenissessie maken met een ring_buffer doel in het geheugen

Van toepassing op: Azure SQL DatabaseAzure SQL Managed Instance

De stappen op hoog niveau in dit scenario zijn:

  1. Een gebeurtenissessie met een ring_buffer doel maken en starten
  2. Vastgelegde gebeurtenisgegevens weergeven als XML
  3. Vastgelegde gebeurtenisgegevens weergeven als een relationele rijenset

Met het ring_buffer doel zijn de stappen eenvoudiger dan met het event_file doel, omdat u geen gebeurtenisgegevens hoeft op te slaan in Azure Storage.

Een gebeurtenissessie maken en starten met een ring_buffer doel

Als u een nieuwe gebeurtenissessie wilt maken in SQL Server Management Studio (SSMS), vouwt u het knooppunt Uitgebreide gebeurtenissen uit. Dit knooppunt bevindt zich onder de databasemap in Azure SQL Database en onder de map Beheer in Azure SQL Managed Instance. Klik met de rechtermuisknop op de map Sessies en selecteer Nieuwe sessie.... Voer op de pagina Algemeen een naam in voor de sessie, in example-session dit voorbeeld. Selecteer op de pagina Gebeurtenissen een of meer gebeurtenissen die u aan de sessie wilt toevoegen. In dit voorbeeld hebben we de sql_batch_starting gebeurtenis geselecteerd.

Screenshot of the New Session SSMS dialog showing the event selection page with the sql_batch_starting event selected.

Selecteer op de pagina Gegevensopslag de optie ring_buffer als het doeltype. Als u geheugen wilt besparen, raden we u aan het aantal gebeurtenissen op een klein getal (standaard 1000) te houden en het maximale buffergeheugen in te stellen op 1 MB of minder. Zie ring_buffer doel voor meer informatie.

Screenshot of the New Session SSMS dialog showing the data storage selection page with a ring_buffer target selected.

Nu de sessie is geconfigureerd, kunt u desgewenst de knop Script selecteren om een T-SQL-script van de sessie te maken om deze later op te slaan. Dit is het script voor onze voorbeeldsessie:

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

Selecteer OK om de sessie te maken.

Sessiegegevens weergeven als XML

Vouw in Objectverkenner de map Sessies uit om de gebeurtenissessie te zien die u hebt gemaakt. De sessie wordt standaard niet gestart wanneer deze wordt gemaakt. Als u de sessie wilt starten, klikt u met de rechtermuisknop op de sessienaam en selecteert u Sessie starten. U kunt deze later stoppen door op dezelfde manier stopsessie te selecteren zodra de sessie wordt uitgevoerd.

Omdat T-SQL-batches worden uitgevoerd in deze database of het beheerde exemplaar, schrijft de sessie gebeurtenissen in een geheugenbuffer. Omdat de grootte van de geheugenbuffer eindig is, worden zodra alle geheugen wordt gebruikt, de oudere gebeurtenissen verwijderd om ruimte te maken voor nieuwere gebeurtenissen.

Vouw in Objectverkenner de sessie uit om het package0.ring_buffer doel te zien en dubbelklik op het doel. U kunt ook met de rechtermuisknop klikken en doelgegevens weergeven... selecteren. Hiermee opent u een raster met een XML-fragment dat wordt weergegeven. Selecteer dit XML-fragment om een XML-document weer te geven dat de inhoud van de geheugenbuffer aangeeft.

In de eerste regel van het XML-document worden sessie- en doelmetagegevens beschreven:

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

In dit voorbeeld zien we dat 17 gebeurtenissen zijn verwerkt door het ring_buffer doel. Er zijn geen gebeurtenissen verwijderd omdat het buffergeheugen niet is uitgeput en het maximum aantal gebeurtenissen dat we hebben geconfigureerd (1000) niet is bereikt.

Tip

Let op het truncated kenmerk. Als deze optie is ingesteld 1, betekent dit dat de XML-weergave van de geheugenbuffer niet de volledige inhoud van de buffer weergeeft. Zie ring_buffer doel voor meer informatie.

De rest van het XML-document bevat gebeurtenissen. Een weergave van één gebeurtenis in XML kan er als volgt uitzien:

  <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 bevat het value kenmerk de T-SQL-batch (één query in dit voorbeeld).

Sessiegegevens weergeven als een relationele rijenset

Als u gebeurtenisgegevens uit een doel in een ring_buffer relationele rijenset wilt zien, moet u een T-SQL-query schrijven die gebruikmaakt van XQuery-expressies om XML te converteren naar relationele gegevens.

Hier volgt een voorbeeld van de sessie die we hebben gemaakt, waarbij eerst de meest recente gebeurtenissen worden weergegeven:

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;