Criar uma sessão de evento com um destino ring_buffer na memória
Aplica-se a:Banco de Dados SQL do Azure Instância Gerenciada SQLdo Azure
As etapas de alto nível neste passo a passo são:
- Criar e iniciar uma sessão de evento com um
ring_buffer
destino - Exibir dados de eventos capturados como XML
- Exibir dados de eventos capturados como um conjunto de linhas relacional
Com o destino, as etapas são mais simples do que com o ring_buffer
event_file
destino porque você não precisa armazenar dados de eventos no Armazenamento do Azure.
Criar e iniciar uma sessão de evento com um destino ring_buffer
Para criar uma nova sessão de evento no SQL Server Management Studio (SSMS), expanda o nó Eventos Estendidos . Este nó está sob a pasta de banco de dados no Banco de Dados SQL do Azure e sob a pasta Gerenciamento na Instância Gerenciada SQL do Azure. Clique com o botão direito do mouse na pasta Sessões e selecione Nova sessão.... Na página Geral , insira um nome para a sessão, que está example-session
neste exemplo. Na página Eventos, selecione um ou mais eventos para adicionar à sessão. Neste exemplo, selecionamos o sql_batch_starting
evento.
Na página Armazenamento de Dados, selecione ring_buffer
como o tipo de destino. Para conservar memória, recomendamos que você mantenha o número de eventos para um número pequeno (1.000 por padrão) e defina a memória buffer máxima para 1 MB ou menos. Para obter detalhes, consulte ring_buffer destino.
Agora que a sessão está configurada, você pode, opcionalmente, selecionar o botão Script para criar um script T-SQL da sessão para salvá-lo para mais tarde. Aqui está o script para nossa sessão de exemplo:
CREATE EVENT SESSION [example-session] ON DATABASE
ADD EVENT sqlserver.sql_batch_starting
ADD TARGET package0.ring_buffer(SET max_memory=(1024))
GO
Selecione OK para criar a sessão.
Exibir dados de sessão como XML
No Pesquisador de Objetos, expanda a pasta Sessões para ver a sessão de evento que você criou. Por padrão, a sessão não é iniciada quando é criada. Para iniciar a sessão, clique com o botão direito do rato no nome da sessão e selecione Iniciar sessão. Mais tarde, você pode pará-lo selecionando de forma semelhante Parar sessão, uma vez que a sessão esteja em execução.
Como os lotes T-SQL são executados nesse banco de dados ou instância gerenciada, a sessão grava eventos em um buffer de memória. Como o tamanho do buffer de memória é finito, uma vez que toda a memória é usada, os eventos mais antigos são descartados para abrir espaço para eventos mais recentes.
No Pesquisador de Objetos, expanda a sessão para ver o package0.ring_buffer
destino e clique duas vezes no destino. Você também pode clicar com o botão direito do mouse e selecionar Exibir dados de destino.... Isso abre uma grade com um fragmento XML mostrado. Selecione este fragmento XML para ver um documento XML que representa o conteúdo do buffer de memória.
A primeira linha do documento XML descreve os metadados de sessão e destino:
<RingBufferTarget truncated="0" processingTime="0" totalEventsProcessed="17" eventCount="17" droppedCount="0" memoryUsed="32070">
Neste exemplo, vemos que 17 eventos foram processados pelo ring_buffer
destino. Nenhum evento foi descartado porque a memória do buffer não se esgotou e o número máximo de eventos que configuramos (1.000) não foi atingido.
Gorjeta
Preste atenção ao truncated
atributo. Se estiver definido como 1
, significa que a representação XML do buffer de memória não está mostrando todo o conteúdo do buffer. Para obter mais informações, consulte ring_buffer destino.
O restante do documento XML contém eventos. Uma representação de um único evento em XML pode ter esta aparência:
<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>
Aqui, o atributo contém o value
lote T-SQL (uma única consulta neste exemplo).
Exibir dados de sessão como um conjunto de linhas relacional
Para ver dados de eventos de um destino em um ring_buffer
conjunto de linhas relacional, você precisa escrever uma consulta T-SQL que use expressões XQuery para converter XML em dados relacionais.
Aqui está um exemplo para a sessão que criamos, exibindo os eventos mais recentes primeiro:
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;