Compartilhar via


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 de SQL do Azure Banco de Dados SQL no Fabric

As etapas de alto nível neste passo a passo são:

  1. Criar e iniciar uma sessão de evento com um destino ring_buffer
  2. Exibir dados de eventos capturados como XML
  3. Exibir dados de eventos capturados como um conjunto de linhas relacional

Com o destino ring_buffer, as etapas são mais simples do que com o destino event_file, pois você não precisa armazenar dados de eventos no Armazenamento do Azure. Este artigo é relevante para o Banco de Dados SQL do Fabric em que o Banco de Dados SQL do Azure é mencionado.

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. Esse nó está na pasta de banco de dados no Banco de Dados SQL do Azure e na pasta Gerenciamento na Instância Gerenciada de SQL do Azure. Clique com o botão direito do mouse na pasta Sessões e selecione Nova Sessão.... Na página Geral, informe um nome para a sessão, que neste exemplo é example-session. Na página Eventos, selecione um ou mais eventos para adicionar à sessão. Neste exemplo, selecionamos o evento sql_batch_starting.

Captura de tela da caixa de diálogo Novo SSMS de Sessão mostrando a página de seleção de eventos com o evento sql_batch_starting selecionado.

Na página Armazenamento de Dados, selecione ring_buffer como o tipo de destino. Para preservar memória, recomendamos que você mantenha o número de eventos pequeno (mil por padrão) e defina a memória de buffer máxima para 1 MB ou menos. Para obter detalhes, consulte Destino ring_buffer.

Captura de tela da caixa de diálogo New Session SSMS mostrando a página de seleção de armazenamento de dados com um destino ring_buffer selecionado.

Agora que a sessão está configurada, você tem a opção de selecionar o botão Script para criar um script T-SQL da sessão e salvá-lo para mais tarde. Veja abaixo o script do nosso exemplo de sessão:

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 da 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 mouse no nome da sessão e selecione Iniciar Sessão. Você pode interrompê-la mais tarde selecionando Parar sessão da mesma forma, depois que a sessão estiver em execução.

À medida que 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, depois que toda a memória for usada, os eventos mais antigos serão descartados para liberar espaço para eventos mais recentes.

No Pesquisador de Objetos, expanda a sessão para ver o destino package0.ring_buffer e clique duas vezes no destino. Você também pode clicar com o botão direito do mouse e selecionar Exibir Dados de Destino.... Uma grade com um fragmento de XML será mostrada. Selecione esse fragmento de XML para ver um documento XML que representa o conteúdo do buffer de memória.

A primeira linha do documento XML descreve metadados da sessão e do destino:

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

Neste exemplo, vemos que 17 eventos foram processados pelo destino ring_buffer. Nenhum evento foi descartado porque a memória do buffer não foi esgotada e o número máximo de eventos que configuramos (mil) não foi atingido.

Dica

Preste atenção no atributo truncated. 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, confira Destino ring_buffer.

O restante do documento XML contém eventos. Uma representação de um único evento em XML pode ser desta forma:

  <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 value contém o lote T-SQL (uma única consulta neste exemplo).

Exibir dados da sessão como um conjunto de linhas relacional

Para ver dados de evento de um destino ring_buffer em um conjunto de linhas relacional, você precisa escrever uma consulta T-SQL que use expressões XQuery para converter XML em dados relacionais.

Veja abaixo 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;