Creare una sessione eventi con una destinazione ring_buffer in memoria
Si applica a: database SQL di Azure Istanza gestita di SQL di Azure database SQL in Fabric
I passaggi generali di questa procedura dettagliata sono i seguenti:
- Creare e avviare una sessione eventi con una destinazione
ring_buffer
- Visualizzare i dati degli eventi acquisiti come XML
- 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.
Questo articolo è rilevante per il database SQL dell'infrastruttura in cui database SQL di Azure è menzionato.
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
.
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.
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;