Creare una sessione eventi con una destinazione ring_buffer in memoria

Si applica a: Database SQL di Azure Istanza gestita di SQL di Azure

I passaggi generali di questa procedura dettagliata sono i seguenti:

  1. Creare e avviare una sessione eventi con una destinazione ring_buffer
  2. Visualizzare i dati degli eventi acquisiti come XML
  3. Visualizzare i dati degli eventi acquisiti come set di righe relazionale

Con la destinazione ring_buffer, i passaggi sono più semplici rispetto a quelli della destinazione event_file perché non è necessario archiviare i dati degli eventi in Archiviazione di Azure.

Creare e avviare una sessione eventi con una destinazione ring_buffer

Per creare una nuova sessione eventi in SQL Server Management Studio (SSMS), espandere il nodo Eventi estesi. Questo nodo si trova nella cartella del database in database SQL di Azure e nella cartella Gestione nell’Istanza gestita di SQL di Azure. Fare clic con il pulsante destro del mouse sulla cartella Sessioni e scegliere Nuova sessione. Nella pagina Generale immettere un nome per la sessione, example-session in questo esempio. Nella pagina Eventi selezionare uno o più eventi da aggiungere alla sessione. In questo esempio, è stato selezionato l’evento sql_batch_starting.

Screenshot della finestra di dialogo Nuova Sessione SSMS che mostra la pagina di selezione dell'evento con l'evento sql_batch_starting selezionato.

Nella pagina Archiviazione dati selezionare ring_buffer come tipo di destinazione. Per risparmiare memoria, è consigliabile mantenere un numero ridotto di eventi (1.000 per impostazione predefinita) e impostare la memoria massima del buffer su 1 MB o meno. Per informazioni dettagliate, vedere ring_buffer destinazione.

Screenshot della finestra di dialogo Nuova Sessione SSMS che mostra la pagina di selezione dell'archiviazione dei dati con una destinazione ring_buffer selezionata.

Ora che la sessione è configurata, è possibile selezionare facoltativamente il pulsante Script per creare uno script T-SQL della sessione per salvarlo per un secondo momento. Ecco lo script per la sessione di esempio:

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

Selezionare OK per creare la sessione.

Visualizzare i dati della sessione come XML

In Esplora oggetti espandere la cartella Sessioni per visualizzare la sessione eventi creata. Per impostazione predefinita, la sessione non viene avviata al momento della creazione. Per avviare la sessione, fare clic con il pulsante destro del mouse sul nome della sessione e scegliere Avvia sessione. In modo analogo, mentre la sessione è in esecuzione, è possibile arrestarla in un secondo momento selezionando Arresta sessione.

Poiché i batch T-SQL vengono eseguiti in questo database o in un'istanza gestita, la sessione scrive gli eventi in un buffer di memoria. Poiché le dimensioni del buffer di memoria è limitata, una volta che si esaurisce gli eventi meno recenti vengono eliminati per fare spazio per gli eventi più recenti.

In Esplora oggetti espandere la sessione per visualizzare la destinazione package0.ring_buffer e fare doppio clic sulla destinazione. È anche possibile fare clic con il pulsante destro del mouse e selezionare Visualizza dati di destinazione.... Verrà aperta una griglia con un frammento XML visualizzato. Selezionare questo frammento XML per visualizzare un documento XML che rappresenta il contenuto del buffer di memoria.

La prima riga del documento XML descrive i metadati di sessione e di destinazione:

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

In questo esempio si noterà che 17 eventi sono stati elaborati dalla destinazione ring_buffer. Non sono stati eliminati eventi perché la memoria del buffer non è stata esaurita e non è stato raggiunto il numero massimo di eventi configurati (1.000).

Suggerimento

Prestare attenzione all'attributo truncated. Se è impostato su 1, significa che la rappresentazione XML del buffer di memoria non mostra l'intero contenuto del buffer. Per altre informazioni, vedere destinazione ring_buffer.

Il resto del documento XML contiene eventi. Una dichiarazione di un singolo evento in XML potrebbe essere simile alla seguente:

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

In questo caso, l'attributo value contiene il batch T-SQL (una singola query in questo esempio).

Visualizzare i dati della sessione come set di righe relazionali

Per visualizzare i dati degli eventi da una destinazione ring_buffer in un set di righe relazionale, è necessario scrivere una query T-SQL che usa espressioni XQuery per convertire XML in dati relazionali.

Ecco un esempio per la sessione creata, visualizzando prima gli eventi più recenti:

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;