Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Base de dados SQL no Microsoft Fabric
Este artigo explica quando e como utilizar alvos de Eventos Estendidos. Para cada alvo, o artigo descreve:
- Suas habilidades em coletar e relatar dados de eventos
- Exemplos de sessões de eventos usando o alvo
A tabela a seguir descreve a disponibilidade de cada tipo de destino em diferentes plataformas SQL.
| Tipo de alvo | SQL Server | Banco de Dados SQL do Azure e Banco de Dados SQL no Fabric | Azure SQL Managed Instance |
|---|---|---|---|
| ficheiro_evento | Sim | Sim | Sim |
| ring_buffer | Sim | Sim | Sim |
| event_stream | Sim | Sim | Sim |
| histograma | Sim | Sim | Sim |
| contador_de_eventos | Sim | Sim | Sim |
| pair_matching | Sim | Não | Não |
| etw_classic_sync_target | Sim | Não | Não |
A menos que indicado de forma diferente, os destinos processam os dados que recebem de forma assíncrona.
Para tirar o máximo partido deste artigo, deve:
- Esteja familiarizado com as noções básicas de Eventos Estendidos, conforme descrito em Guia de início rápido: Eventos estendidos.
- Use uma versão recente do SQL Server Management Studio (SSMS).
arquivo_evento destino
O event_file destino grava a saída da sessão de eventos dos buffers de memória num ficheiro de disco ou num blob no Armazenamento Azure.
Você especifica o parâmetro
filenamena cláusulaADD TARGET. A extensão do arquivo deve serxel.O nome do arquivo escolhido é usado pelo sistema como um prefixo ao qual um valor numérico baseado em data e hora é acrescentado, seguido pela
xelextensão.Opcionalmente, você pode especificar o
MAX_FILE_SIZEparâmetro. Ele define o tamanho máximo em megabytes (MB) para o qual o arquivo pode crescer antes que um novo arquivo seja criado.Opcionalmente, você pode especificar a
MAX_ROLLOVER_FILESopção para escolher o número máximo de arquivos a serem mantidos no sistema de arquivos, além do arquivo atual. O valor predefinido éUNLIMITED. QuandoMAX_ROLLOVER_FILESé avaliado, se o número de arquivos exceder aMAX_ROLLOVER_FILESconfiguração, os arquivos mais antigos são excluídos.
Importante
Dependendo dos eventos adicionados a uma sessão, os ficheiros produzidos pelo destino event_file podem conter dados sensíveis. Analise cuidadosamente o sistema de arquivos e compartilhe permissões no diretório e em arquivos individuais .xel , incluindo acesso herdado, para evitar a concessão de acesso de leitura desnecessário. Siga o princípio do menor privilégio. Para reduzir o risco de coletar dados confidenciais inadvertidamente, evite sessões de eventos de longa duração se eles puderem coletar dados confidenciais.
Observação
O Banco de Dados SQL do Azure e a Instância Gerenciada SQL do Azure dão suporte apenas a blobs no filename como o valor do parâmetro. Para obter um exemplo de event_file código para o Banco de Dados SQL do Azure, o Banco de Dados SQL no Fabric ou a Instância Gerenciada SQL do Azure, consulte Criar uma sessão de evento com um destino event_file no Armazenamento do Azure.
Criar uma sessão de evento com destino event_file no sistema de arquivos local
Para obter um passo a passo para criar uma sessão de evento usando um event_file com armazenamento de arquivos local, com SSMS ou T-SQL, consulte Guia de início rápido: eventos estendidos.
Criar uma sessão de evento com destino event_file no Armazenamento do Azure
Para obter uma descrição detalhada de como criar uma conta de armazenamento no Armazenamento do Azure, consulte Criar uma conta de armazenamento. Você pode criar uma conta de armazenamento usando o portal do Azure, PowerShell, Azure SQL, um modelo ARM ou um modelo Bicep. Use uma conta que:
- É uma
Standard general-purpose v2conta. - Usa a
Hotcamada de acesso blob. - Se estiver usando o SQL Server na Máquina Virtual do Azure (VM do Azure), a conta de armazenamento deverá estar na mesma região do Azure que sua VM do Azure.
- Não tem o namespace hierárquico habilitado.
Em seguida, crie um contêiner nessa conta de armazenamento usando o portal do Azure. Você também pode criar um contêiner usando o PowerShell ou usando a CLI do Azure.
Observe os nomes da conta de armazenamento e do contêiner que você criou. Você os usa nas etapas a seguir.
Para ler e gravar dados de eventos, o mecanismo de banco de dados requer acesso específico. Você concede esse acesso de forma diferente, dependendo da sua escolha de tipo de autenticação: identidade gerenciada ou autenticação baseada em segredo com um token de assinatura de acesso compartilhado (SAS).
Para autenticar no Armazenamento do Azure, o mecanismo de banco de dados requer uma credencial com escopo de servidor ou uma credencial com escopo de banco de dados, que informa que tipo de autenticação usar e fornece um segredo para autenticação baseada em segredo. A criação dessa credencial requer a permissão do CONTROL banco de dados.
Para o SQL Server e a Instância Gerenciada SQL do Azure, essa permissão é necessária no master banco de dados. Por padrão, a permissão é mantida pelos membros da função de banco de db_owner dados no master, e pelos membros da sysadmin função de servidor na instância. Para o Banco de Dados SQL do Azure e o Banco de Dados SQL na Malha, essa permissão é mantida pelo proprietário do banco de dados (dbo), pelos membros da db_owner função de banco de dados e pelo administrador do servidor lógico.
Depois que uma credencial é criada, as etapas restantes para criar uma sessão de evento não exigem a CONTROL permissão. Consulte Permissões para obter as permissões específicas necessárias.
Conceder acesso usando identidade gerenciada
Se estiver usando a identidade gerenciada com a autenticação do Microsoft Entra, atribua a função RBAC do Colaborador de Dados do Blob de Armazenamento para o contêiner à identidade gerenciada usada pelo mecanismo de banco de dados. Para obter mais informações, consulte o seguinte com base na plataforma SQL:
- A identidade gerenciada do servidor lógico do Banco de Dados SQL do Azure.
- A identidade gerenciada da instância gerenciada SQL do Azure.
- A identidade gerenciada da VM do Azure que hospeda sua instância do SQL Server. Para obter mais informações, consulte Como as identidades gerenciadas para recursos do Azure funcionam com máquinas virtuais do Azure.
- A identidade gerenciada da instância do SQL Server habilitada para Arc.
Quando a atribuição de função RBAC estiver configurada, use as seguintes etapas:
Crie uma credencial usando T-SQL.
Antes de executar o seguinte lote T-SQL, faça a seguinte alteração:
- Em todas as três ocorrências do
https://<storage-account-name>.blob.core.windows.net/<container-name>, substitua<storage-account-name>pelo nome da sua conta de armazenamento e substitua<container-name>pelo nome do seu contêiner. Certifique-se de que não haja uma barra final no URL.
Criar uma credencial com escopo de servidor: (Aplica-se ao SQL Server, Instância Gerenciada SQL do Azure)
Usando uma ferramenta de cliente como o SSMS, abra uma nova janela de consulta, conecte-se ao
masterbanco de dados na instância em que deseja criar a sessão de evento e cole o seguinte lote T-SQL./* The name of the credential must match the URL of the blob container. */ IF EXISTS (SELECT 1 FROM sys.credentials WHERE name = 'https://<storage-account-name>.blob.core.windows.net/<container-name>') DROP CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>]; /* When using managed identity, the credential does not contain a secret */ CREATE CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>] WITH IDENTITY = 'MANAGED IDENTITY';Criar uma credencial com âmbito de base de dados: (Aplica-se ao SQL Database do Azure, Instância Gerida do SQL do Azure, Base de Dados SQL no Fabric)
Usando uma ferramenta de cliente como o SSMS, abra uma nova janela de consulta, conecte-se ao banco de dados do usuário onde você cria a sessão de eventos e cole o seguinte lote T-SQL. Verifique se você está conectado ao banco de dados de usuários e não ao
masterbanco de dados./* The name of the credential must match the URL of the blob container. */ IF EXISTS (SELECT 1 FROM sys.database_credentials WHERE name = 'https://<storage-account-name>.blob.core.windows.net/<container-name>') DROP DATABASE SCOPED CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>]; /* When using managed identity, the credential does not contain a secret */ CREATE DATABASE SCOPED CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>] WITH IDENTITY = 'MANAGED IDENTITY';- Em todas as três ocorrências do
Em seguida, siga as etapas para criar uma sessão de evento no SSMS com destino event_file no Armazenamento do Azure.
Conceder acesso usando um token de assinatura de acesso compartilhado (SAS)
Se estiver usando a autenticação baseada em segredo, crie um token de assinatura de acesso compartilhado (SAS) para o contêiner. Para usar esse tipo de autenticação, a opção Permitir acesso à chave da conta de armazenamento deve estar habilitada para a conta de armazenamento. Para obter mais informações, consulte Impedir autorização de chave compartilhada para uma conta de armazenamento do Azure.
No portal do Azure, navegue até a conta de armazenamento e o contêiner que você criou. Selecione o contêiner e navegue até Configurações > Tokens de acesso compartilhado.
O token SAS deve satisfazer os seguintes requisitos:
-
Permissões definidas como
Read,Write, ,DeleteList. - A hora de início e a hora de expiração devem abranger o tempo de vida da sessão do evento. O token SAS criado só funciona dentro desse intervalo de tempo.
- Para o Banco de Dados SQL do Azure, a Instância Gerenciada SQL do Azure e o Banco de Dados SQL no Fabric, o token SAS não deve ter restrições de endereço IP.
Selecione o botão Gerar token SAS e URL. O token SAS está na caixa de token SAS de Blob . Você pode copiá-lo para usar na próxima etapa.
Importante
O token SAS fornece acesso de leitura e gravação a esse contêiner. Trate-o como trataria uma palavra-passe ou qualquer outro segredo.
-
Permissões definidas como
Crie uma credencial para armazenar o token SAS usando T-SQL.
Antes de executar o seguinte lote T-SQL, faça estas alterações:
Se estiver a criar uma credencial com escopo de servidor e a usar a instrução `
CREATE MASTER KEY`, substitua `<password>` por uma senha forte que proteja a chave mestra. Para obter mais informações, consulte CREATE MASTER KEY.Em todas as três ocorrências do
https://<storage-account-name>.blob.core.windows.net/<container-name>, substitua<storage-account-name>pelo nome da sua conta de armazenamento e substitua<container-name>pelo nome do seu contêiner.Na cláusula
SECRET, substitua<sas-token>pelo token SAS copiado na etapa anterior.
Criar uma credencial com escopo de servidor: (Aplica-se ao SQL Server, Instância Gerenciada SQL do Azure)
Usando uma ferramenta de cliente como o SSMS, abra uma nova janela de consulta, conecte-a
masterao banco de dados na instância em que você cria a sessão de evento e cole o seguinte lote T-SQL./* Create a master key to protect the secret of the credential */ IF NOT EXISTS (SELECT 1 FROM sys.symmetric_keys WHERE name = '##MS_DatabaseMasterKey##') CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>' /* The name of the credential must match the URL of the blob container. */; IF EXISTS (SELECT 1 FROM sys.credentials WHERE name = 'https://<storage-account-name>.blob.core.windows.net/<container-name>') DROP CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>]; /* The secret is the SAS token for the container. */ CREATE CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>] WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = '<sas-token>';Criar uma credencial com âmbito de base de dados: (Aplica-se ao SQL Database do Azure, Instância Gerida do SQL do Azure, Base de Dados SQL no Fabric)
Usando uma ferramenta de cliente como o SSMS, abra uma nova janela de consulta, conecte-se ao banco de dados onde você cria a sessão de eventos e cole o seguinte lote T-SQL. Verifique se você está conectado ao banco de dados de usuários e não ao
masterbanco de dados./* The name of the credential must match the URL of the blob container. */ IF EXISTS (SELECT 1 FROM sys.database_credentials WHERE name = 'https://<storage-account-name>.blob.core.windows.net/<container-name>') DROP DATABASE SCOPED CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>]; /* The secret is the SAS token for the container. */ CREATE DATABASE SCOPED CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>] WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = '<sas-token>';Em seguida, siga as etapas na próxima seção para criar uma sessão de evento no SSMS com destino event_file no Armazenamento do Azure.
Criar uma sessão de evento no SSMS com destino event_file no Armazenamento do Azure
Depois que a credencial que fornece acesso ao contêiner de armazenamento for criada, você poderá criar a sessão do evento. Ao contrário da criação da credencial, a criação de uma sessão de evento não requer a CONTROL permissão. Depois que a credencial for criada, você poderá criar sessões de eventos mesmo que tenha permissões mais restritas. Consulte Permissões para obter as permissões específicas necessárias.
Para criar uma nova sessão de evento no SSMS:
Para SQL Server e a Instância Gerenciada SQL do Azure, expanda o nó Eventos Estendidos na pasta Gestão. Para a Base de Dados SQL do Azure e o SQL Database no Fabric, expanda o nó Eventos Estendidos na base de dados.
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 é
example-sessionpara o exemplo de código a seguir.Na página Eventos , selecione um ou mais eventos para adicionar à sessão. Por exemplo, você pode selecionar o
sql_batch_startingevento.Na página Armazenamento de Dados , selecione
event_filecomo o tipo de destino. Cole a URL do contêiner de armazenamento na caixa URL de armazenamento . Digite uma barra inclinada (/) no final deste endereço URL, seguido do nome do ficheiro (blob). Por exemplo,https://<storage-account-name>.blob.core.windows.net/<container-name>/example-session.xel.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.
Selecione OK para criar a sessão.
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 interrompê-lo selecionando Parar sessão quando a sessão estiver em execução.
À medida que os lotes T-SQL são executados, a sessão grava os sql_batch_starting eventos no example-session.xel blob no contêiner de armazenamento.
Observação
Para Instância Gerenciada SQL, em vez de colar a URL do contêiner de armazenamento na página Armazenamento de dados , use o botão Script para criar um script T-SQL da sessão. Especifique a URL do contêiner como o valor para o filename argumento e execute o script para criar a sessão.
Criar uma sessão de evento com destino event_file no Armazenamento do Azure em T-SQL
Aqui está um exemplo da CREATE EVENT SESSION cláusula com uma ADD TARGET que adiciona um destino baseado no event_file Armazenamento do Azure.
CREATE EVENT SESSION [example-session]
ON SERVER
ADD EVENT sqlserver.sql_batch_starting
ADD TARGET package0.event_file
(
SET filename = N'https://<storage-account-name>.blob.core.windows.net/<container-name>/example-session.xel'
)
GO
Para usar este exemplo no Banco de Dados SQL do Azure ou no Banco de Dados SQL na Malha, substitua ON SERVER por ON DATABASE.
Solucionar problemas de sessões de eventos com destino event_file no Armazenamento do Azure
A lista a seguir contém erros que você pode encontrar ao iniciar uma sessão de evento estendida que usa o Armazenamento do Azure, com as possíveis explicações para o erro.
-
O sistema operacional retornou o erro 5: 'Acesso negado'.
- Se estiver usando a autenticação de identidade gerenciada:
- A identidade gerenciada usada pelo mecanismo de banco de dados não tem a atribuição de função RBAC necessária. Para obter mais informações, consulte Conceder acesso usando identidade gerenciada.
- O firewall da conta de armazenamento está habilitado e uma exceção para permitir que serviços confiáveis do Azure acessem a conta de armazenamento também está habilitada, mas uma
Microsoft.Sql/serversinstância de recurso para o servidor lógico não foi adicionada à lista de instâncias de recursos às quais é concedido acesso. Para obter mais informações, consulte Conceder acesso às instâncias de recursos do Azure. - Se estiver usando um perímetro de segurança de rede com modo imposto, o banco de dados e a conta de armazenamento não estarão no mesmo perímetro.
- Se estiver usando a autenticação de token SAS:
- O firewall da conta de armazenamento está habilitado. Isso não é suportado para sessões de eventos que usam autenticação de token SAS.
- O token SAS não tem permissões suficientes ou expirou. Para obter mais informações, consulte Conceder acesso usando um token SAS.
- Se estiver usando um perímetro de segurança de rede com modo imposto, as regras de acesso para permitir a comunicação de saída irrestrita do banco de dados e a comunicação de entrada irrestrita para a conta de armazenamento não estarão em vigor.
- Se estiver usando a autenticação de identidade gerenciada:
-
O sistema operacional retornou o erro 86: 'A senha de rede especificada não está correta'.
- Não há nenhuma credencial com escopo de banco de dados (para o Banco de Dados SQL do Azure) ou credencial com escopo de servidor (para Instância Gerenciada SQL do Azure ou SQL Server) com o nome correspondente à URL do contêiner de blob. Para obter mais informações, consulte os exemplos de Conceder acesso usando identidade gerenciada ou Conceder acesso usando um token SAS.
- O nome da credencial termina com uma barra (
/). O nome da credencial deve terminar com o nome do container sem incluir a barra final.
-
O sistema operacional retornou o erro 3: "O sistema não consegue encontrar o caminho especificado."
- O contêiner especificado na URL do contêiner de blob não existe.
-
O sistema operacional retornou o erro 13: 'Os dados são inválidos'.
- Há uma política de imutabilidade no contêiner de blob. O armazenamento imutável não é suportado para sessões de eventos.
- A conta de armazenamento tem o namespace hierárquico habilitado. As contas de armazenamento com namespace hierárquico ativado não são suportadas para sessões de evento.
Função sys.fn_xe_file_target_read_file()
O event_file destino armazena os dados que recebe em um formato binário que não é legível por humanos. A sys.fn_xe_file_target_read_file função permite representar o conteúdo de um xel arquivo como um conjunto de linhas relacional. Para obter mais informações, incluindo exemplos de uso, consulte sys.fn_xe_file_target_read_file.
ring_buffer alvo
O ring_buffer destino é útil para iniciar rapidamente uma sessão de eventos e coletar dados de eventos apenas em memória. Quando a memória disponível no buffer de anel é usada por eventos, os eventos mais antigos são descartados. Quando você interrompe a sessão de eventos, toda a saída da sessão para o ring_buffer destino também é descartada.
Você consome dados de um ring_buffer destino convertendo-os em XML, conforme mostrado no exemplo a seguir. Durante essa conversão, todos os dados que não cabem em um documento XML de 4 MB são omitidos. Portanto, mesmo se você capturar mais eventos no buffer de anel usando valores maiores MAX_MEMORY (ou deixando esse parâmetro em seu valor padrão), talvez não seja possível consumir todos eles devido ao limite de 4 MB no tamanho do documento XML, considerando a sobrecarga de marcação XML e cadeias de caracteres Unicode.
Você sabe que o conteúdo do buffer de anel é omitido durante a conversão para XML se o truncated atributo no documento XML estiver definido como 1, por exemplo:
<RingBufferTarget truncated="1" processingTime="0" totalEventsProcessed="284" eventCount="284" droppedCount="0" memoryUsed="64139">
Sugestão
Ao adicionar um ring_buffer destino, defina seu MAX_MEMORY parâmetro como 1.024 KB ou menos. Usar valores maiores pode aumentar o consumo de memória desnecessariamente.
Por padrão, MAX_MEMORY para um ring_buffer alvo não é limitado ao SQL Server, ao passo que é limitado a 32 MB no Banco de Dados SQL do Azure, na Instância Gerida SQL do Azure e na Base de Dados SQL no Fabric.
Criar uma sessão de evento com um destino ring_buffer
Veja um exemplo de criação de uma sessão de eventos com um ring_buffer destino para coletar os lock_acquired eventos, limitando o número total de eventos no buffer de anel a 100. Neste exemplo, o MAX_MEMORY parâmetro aparece duas vezes: uma vez para definir a memória de ring_buffer destino para 1.024 KB e uma vez para definir a memória do buffer de sessão de eventos para 2 MB.
Para usar este exemplo no Banco de Dados SQL do Azure ou no Banco de Dados SQL na Malha, substitua ON SERVER por ON DATABASE.
CREATE EVENT SESSION ring_buffer_lock_acquired
ON SERVER
ADD EVENT sqlserver.lock_acquired
ADD TARGET package0.ring_buffer
(
SET MAX_EVENTS_LIMIT = 100,
MAX_MEMORY = 1024
)
WITH
(
MAX_MEMORY = 2 MB,
MAX_DISPATCH_LATENCY = 3 SECONDS
);
Para iniciar a sessão de eventos, execute a seguinte instrução:
ALTER EVENT SESSION ring_buffer_lock_acquired
ON SERVER
STATE = START;
Para exibir os dados de eventos coletados no buffer de anel no SSMS, expanda o nó da sessão e selecione o package0.ping_buffer alvo. Os dados são exibidos em XML.
Para ver dados de eventos de um ring_buffer destino em um conjunto de linhas relacional enquanto a sessão está ativa, use expressões XQuery para converter XML em dados relacionais. Por exemplo:
;WITH
/* An XML document representing memory buffer contents */
RingBuffer AS
(
SELECT CAST (xst.target_data AS XML) AS TargetData
FROM sys.dm_xe_session_targets AS xst
INNER JOIN sys.dm_xe_sessions AS xs
ON xst.event_session_address = xs.address
WHERE xs.name = N'ring_buffer_lock_acquired'
),
/* 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;
destino do event_stream
O event_stream destino só pode ser usado em programas .NET escritos em linguagens como C#. Os desenvolvedores podem acessar um fluxo de eventos por meio de classes do .NET Framework na Microsoft.SqlServer.XEvents.Linq namespace. Este alvo está implicitamente presente em qualquer sessão de evento. Ele não pode ser adicionado usando T-SQL.
Para obter mais informações, consulte sys.fn_MSxe_read_event_stream.
Se encontrares o erro 25726, The event data stream was disconnected because there were too many outstanding events. To avoid this error either remove events or actions from your session or add a more restrictive predicate filter to your session. ao leres a partir do event_stream destino, isso significa que o fluxo de eventos foi preenchido com dados mais rapidamente do que o cliente conseguiu consumir. Isso faz com que o Mecanismo de Banco de Dados se desconecte do fluxo de eventos para evitar afetar o desempenho do Mecanismo de Banco de Dados.
alvo do histograma
O histogram alvo conta o número de ocorrências de eventos para valores distintos num campo ou numa ação. Para cada valor distinto, um bucket de contagem separado é usado. O histogram destino processa os dados que recebe de forma síncrona.
O SOURCE_TYPE parâmetro controla o histogram comportamento do destino:
-
SOURCE_TYPE = 0: coletar dados para um campo de evento. -
SOURCE_TYPE = 1: coletar dados para uma ação. Este é o padrão.
O valor padrão do SLOTS parâmetro é 256. Se você atribuir outro valor, o valor será arredondado para a próxima potência de 2. Por exemplo, SLOTS = 59 seria arredondado para 64. O número máximo de slots de histograma para um histogram alvo é 16.384.
Ao usar histogram como destino, às vezes você pode ver resultados inesperados. Alguns eventos podem não aparecer nos slots esperados, enquanto outros podem mostrar uma contagem de eventos maior do que o esperado. Isso pode acontecer se ocorrer uma colisão de hash ao atribuir eventos a slots. Embora isso seja raro, se ocorrer uma colisão de hash, um evento que deve ser contado em um slot é contado em outro. Por esse motivo, deve-se ter cuidado ao presumir que um evento não ocorreu apenas porque a contagem em um determinado slot indica zero.
Como exemplo, considere o seguinte cenário:
- Você configura uma sessão de Eventos Estendidos, usando
histogramcomo destino e categorizando eventos porobject_id, para recolher estatísticas de execução de procedimentos armazenados. - Você executa o procedimento armazenado
A. Em seguida, execute o procedimentoBarmazenado .
Se a função hash retornar o mesmo valor para os object_id dois procedimentos armazenados, o histograma mostrará A que está sendo executado duas vezes enquanto B não aparece.
Para atenuar esse problema quando o número de valores distintos é relativamente pequeno, defina o número de slots de histograma maior do que o quadrado dos valores distintos esperados. Por exemplo, se o histogram destino tiver seu SOURCE definido para o table_name campo de evento e houver 20 tabelas no banco de dados, então 20*20 = 400. A próxima potência de 2 maior que 400 é 512, que é o número recomendado de slots neste exemplo.
Cada histogram destino aceita dados de uma única fonte (um campo de evento ou uma ação) e contém apenas um histograma. Não é possível adicionar mais de um destino do mesmo tipo em cada sessão de evento. Também não é possível ter mais de um tipo de origem por histogram destino. Portanto, uma nova sessão de evento é necessária para controlar diferentes ações ou campos de evento em um destino separado histogram .
Criar uma sessão de evento com um alvo de histograma
Aqui está um exemplo de como criar uma sessão de evento com um histogram alvo.
Para usar este exemplo no Banco de Dados SQL do Azure ou no Banco de Dados SQL na Malha, substitua ON SERVER por ON DATABASE.
CREATE EVENT SESSION histogram_lock_acquired
ON SERVER
ADD EVENT sqlserver.lock_acquired
(
ACTION (sqlos.system_thread_id)
)
ADD TARGET package0.histogram
(
SET FILTERING_EVENT_NAME = N'sqlserver.lock_acquired',
SLOTS = 16,
SOURCE = N'sqlos.system_thread_id',
SOURCE_TYPE = 1
);
Na cláusula ADD TARGET ... (SET ...), o parâmetro SOURCE_TYPE é definido como 1, o que significa que o alvo histogram monitoriza uma ação.
A ADD EVENT ... (ACTION ...) cláusula adiciona a sqlos.system_thread_id ação ao evento. O SOURCE parâmetro é definido para sqlos.system_thread_id usar o ID de thread do sistema coletado por essa ação como a fonte de dados para o histogram destino. O histogram destino neste exemplo conta o número de eventos para cada thread do lock_acquired sistema que adquire bloqueios enquanto a sessão está ativa.
Para iniciar a sessão de eventos, execute a seguinte instrução:
ALTER EVENT SESSION histogram_lock_acquired
ON SERVER
STATE = START;
Para exibir os dados de histograma coletados no SSMS, expanda o nó da sessão e selecione o package0.histogram target. Os dados são exibidos em uma grade de duas colunas. Cada linha representa um bucket de valores distintos e uma contagem de ocorrências.
Veja como os dados capturados pelo histogram alvo neste exemplo podem ser apresentados. Os valores na coluna value são valores system_thread_id. Por exemplo, um total de 236 fechaduras foram adquiridas pelo thread do sistema 6540.
value count
----- -----
6540 236
9308 91
9668 74
10144 49
5244 44
2396 28
Aqui está um exemplo de leitura dos dados de um histogram destino com T-SQL:
WITH histogram_target
AS (SELECT TRY_CAST (st.target_data AS XML) AS target_data
FROM sys.dm_xe_sessions AS s
INNER JOIN sys.dm_xe_session_targets AS st
ON s.address = st.event_session_address
WHERE s.name = 'event-session-name-placeholder'),
histogram
AS (SELECT hb.slot.value('(@count)[1]', 'bigint') AS slot_count,
hb.slot.value('(value/text())[1]', 'nvarchar(max)') AS slot_value
FROM histogram_target AS ht
CROSS APPLY ht.target_data.nodes('/HistogramTarget/Slot') AS hb(slot))
SELECT slot_value,
slot_count
FROM histogram;
event_counter destino
O event_counter destino conta quantas vezes cada evento especificado ocorre.
O event_counter destino não tem parâmetros e processa os dados que recebe de forma síncrona.
Criar uma sessão de evento com um destino event_counter
Aqui está um exemplo de como criar uma sessão de evento com um event_counter alvo. A sessão conta os quatro checkpoint_begin primeiros eventos e, em seguida, para de contar porque seu predicado limita o número de eventos enviados aos alvos a quatro. Você pode gerar o checkpoint_begin evento para este exemplo executando o CHECKPOINT comando.
Para usar este exemplo no Banco de Dados SQL do Azure ou no Banco de Dados SQL na Malha, substitua ON SERVER por ON DATABASE.
CREATE EVENT SESSION event_counter_checkpoint_begin
ON SERVER
ADD EVENT sqlserver.checkpoint_begin
(
WHERE package0.counter <= 4
)
ADD TARGET package0.event_counter
WITH
(
MAX_MEMORY = 4096 KB,
MAX_DISPATCH_LATENCY = 3 SECONDS
);
Para iniciar a sessão de eventos, execute a seguinte instrução:
ALTER EVENT SESSION event_counter_checkpoint_begin
ON SERVER
STATE = START;
Para exibir os dados coletados no SSMS, expanda o nó da sessão e selecione o package0.event_counter alvo. Os dados são exibidos em uma grade de três colunas. Cada linha representa um evento com uma contagem de suas ocorrências.
Veja como os dados capturados pelo event_counter destino neste exemplo podem ficar depois de quatro pontos de controlo ocorrerem.
package_name event_name count
------------ ---------------- -----
sqlserver checkpoint_begin 4
correspondência de pares alvo
O pair_matching destino permite detetar eventos de início que ocorrem sem um evento final correspondente. Por exemplo, pode-se encontrar um evento lock_acquired sem um evento correspondente lock_released, o que pode indicar que uma transação de longa duração está a manter bloqueios.
Os Eventos Estendidos não coincidem automaticamente com os eventos de início e fim. Em vez disso, define a lógica de correspondência na declaração pair_matching na especificação de destino CREATE EVENT SESSION. Quando um evento de início e um evento de fim são emparelhados, o sistema descarta o par, mas retém os eventos de início incomparáveis.
Criar uma sessão de evento com um destino pair_matching
Para este exemplo, criamos uma tabela de exemplo chamada T1, inserimos três linhas e obtemos o object_id valor para esta tabela. Para simplificar, criamos a tabela tempdb na base de dados neste exemplo. Se você usar um banco de dados diferente, ajuste o nome do banco de dados no código de exemplo do T-SQL a seguir.
CREATE TABLE T1 (id INT PRIMARY KEY);
INSERT INTO T1 (id)
VALUES (1), (2), (3);
SELECT OBJECT_ID('T1') AS object_id;
-- object_id = 1029578706
A sessão de eventos a seguir coleta dois eventos lock_acquired e lock_released. Tem também dois objetivos. Um é a event_counter meta que fornece o número de ocorrências para cada evento. O outro é o pair_matching alvo que define a lógica que associa o evento inicial lock_acquired ao evento final lock_released em pares.
A sequência de campos delimitados por vírgulas atribuída a BEGIN_MATCHING_COLUMNS e END_MATCHING_COLUMNS deve ser a mesma. Não são permitidos separadores ou novas linhas entre os campos mencionados no valor delimitado por vírgula, embora sejam permitidos espaços.
Na definição de sessão de evento, usamos um predicado de evento para coletar apenas os tempdb eventos no banco de dados em que o object_id no evento corresponde ao ID de objeto da tabela T1. Ajuste o predicado na WHERE cláusula para usar o identificador do objeto da sua tabela.
Para usar este exemplo no Banco de Dados SQL do Azure ou no Banco de Dados SQL na Malha, substitua ON SERVER por ON DATABASE.
CREATE EVENT SESSION pair_matching_lock_acquired_released
ON SERVER
ADD EVENT sqlserver.lock_acquired
(
SET COLLECT_DATABASE_NAME = 1,
COLLECT_RESOURCE_DESCRIPTION = 1
ACTION (sqlserver.transaction_id)
WHERE (database_name = 'tempdb'
AND object_id = 1029578706)
),
ADD EVENT sqlserver.lock_released
(
SET COLLECT_DATABASE_NAME = 1,
COLLECT_RESOURCE_DESCRIPTION = 1
ACTION (sqlserver.transaction_id)
WHERE (database_name = 'tempdb'
AND object_id = 1029578706)
)
ADD TARGET package0.event_counter,
ADD TARGET package0.pair_matching
(
SET BEGIN_EVENT = N'sqlserver.lock_acquired',
BEGIN_MATCHING_COLUMNS = N'resource_0, resource_1, resource_2, transaction_id, database_id',
END_EVENT = N'sqlserver.lock_released',
END_MATCHING_COLUMNS = N'resource_0, resource_1, resource_2, transaction_id, database_id',
RESPOND_TO_MEMORY_PRESSURE = 1
)
WITH
(
MAX_MEMORY = 8192 KB,
MAX_DISPATCH_LATENCY = 15 SECONDS
);
Para iniciar a sessão de eventos, execute a seguinte instrução:
ALTER EVENT SESSION pair_matching_lock_acquired_released
ON SERVER
STATE = START;
Inicie uma transação que atualize a tabela T1, mas não a confirme nem a reverta. Isso garante que haja fechaduras adquiridas, mas não liberadas.
BEGIN TRANSACTION;
UPDATE T1
SET id = id + 1;
Examinar a saída de cada destino da sessão de eventos pair_matching_lock_acquired_released no SSMS.
O event_counter destino tem a seguinte saída, mostrando que um bloqueio permanece não liberado. No entanto, este alvo não mostra nenhum detalhe desta fechadura.
package_name event_name count
------------ ---------- -----
sqlserver lock_acquired 4
sqlserver lock_released 3
A saída do pair_matching alvo é a seguinte, truncada para brevidade. Como sugerido pela saída event_counter, de facto vemos a linha para o evento não emparelhado lock_acquired, com mais detalhes sobre o evento.
package_name event_name timestamp associated_object_id database_id database_name
------------ ------------ --------- ------------- ----------- -------------
sqlserver lock_acquired 2025-10-01 20:06:07.1890000 1029578706 2 tempdb
Reverter a transação.
ROLLBACK;
Se for adicionada uma ação a um evento coletado pelo destino pair_matching, os dados da ação também serão coletados. Por exemplo, você pode incluir o texto T-SQL fornecido pela sqlserver.sql_text ação com o evento. Neste exemplo, ele coletaria a consulta que adquiriu o bloqueio.
etw_classic_sync_target alvo de sincronização clássico
No SQL Server, os Eventos Estendidos podem interoperar com o Rastreamento de Eventos para Windows (ETW) para monitorar a atividade do sistema. Para obter mais informações, consulte:
- Rastreamento de eventos para o destino do Windows
- Monitorizar a Atividade do Sistema Usando Eventos Estendidos
Esse destino ETW processa os dados que recebe de forma síncrona.