Início Rápido: Eventos Estendidos

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure

Eventos Estendidos são um recurso de monitoramento de desempenho leve que permite que os usuários coletem os dados para monitorar e solucionar problemas. Com Eventos Estendidos, você pode ver detalhes das operações internas do mecanismo de banco de dados que são relevantes para fins de monitoramento de desempenho e solução de problemas. Para saber mais sobre Eventos Estendidos, consulte Visão geral de Eventos Estendidos.

Este artigo tem como objetivo ajudar administradores, engenheiros e desenvolvedores de SQL que não conhecem o Eventos Estendidos e que desejam começar a usá-lo e ver dados de eventos em apenas alguns minutos.

O Eventos Estendidos também é conhecido como XEvents e, às vezes, apenas como XE.

Depois de ler este artigo, você poderá:

  • Veja como criar uma sessão de evento no SSMS (SQL Server Management Studio), com capturas de tela de exemplo.
  • Correlacione capturas de tela com instruções Transact-SQL equivalentes.
  • Entenda em detalhes os termos e conceitos por trás da interface do usuário do SSMS e das instruções XEvents T-SQL.
  • Saiba como testar sua sessão de evento.
  • Entender os resultados da sessão, incluindo:
    • Opções disponíveis para armazenamento de resultados
    • Resultados brutos versus processados
    • Ferramentas para exibir os resultados de diferentes maneiras e em escalas de tempo diferentes
  • Veja como você pode pesquisar e descobrir todos os eventos disponíveis.
  • Entenda as relações entre as exibições do sistema de Eventos Estendidos.

Dica

Para obter mais informações sobre Eventos Estendidos no Banco de Dados SQL do Azure, incluindo exemplos de código, confira Eventos Estendidos no Banco de Dados SQL e na Instância Gerenciada de SQL do Azure.

Pré-requisitos

Para começar, você precisa do seguinte:

  • Baixe o SSMS (SQL Server Management Studio). Recomendamos o uso de uma versão recente do SSMS com os aprimoramentos e as correções mais recentes.
  • Verifique se sua conta tem CREATE ANY EVENT SESSION (introduzida no SQL Server 2022) ou ALTER ANY EVENT SESSION permissão de servidor.
  • Além disso, ao usar o SSMS e para exibir sessões criadas, o logon requer a permissão VIEW SERVER PERFORMANCE STATE.

Detalhes sobre segurança e permissões relacionadas a Eventos Estendidos ao final deste artigo, no Apêndice.

Eventos Estendidos no SSMS

O SSMS fornece uma interface do usuário totalmente funcional para Eventos Estendidos. Muitos cenários podem ser realizados usando essa interface do usuário, sem exigir o uso do T-SQL ou de exibições de gerenciamento dinâmico (DMVs).

Na próxima seção, é possível ver as etapas da interface do usuário para a criação de uma sessão de Eventos Estendidos e observar os dados que ela relata. Depois de passar pelas etapas práticas ou revê-las neste artigo, você poderá ler sobre os conceitos envolvidos nas etapas para obter uma compreensão mais profunda.

Criar uma sessão de evento no SSMS

Quando você cria uma sessão de eventos estendidos, você informa o sistema:

  • Em quais eventos você está interessado.
  • Como você deseja que o sistema relate os dados para você.

A demonstração abre a caixa de diálogo Nova Sessão e mostra como usar suas quatro páginas, denominadas:

  • Geral
  • Eventos
  • Armazenamento de Dados
  • Avançado

O texto e as capturas de tela de suporte podem ser ligeiramente diferentes na sua versão do SSMS, mas ainda assim devem ser relevantes para a explicação dos conceitos básicos.

  1. Conecte-se a uma instância do mecanismo de banco de dados. Há suporte para Eventos Estendidos a partir do SQL Server 2014 (12.x), no Banco de Dados SQL do Azure e na Instância Gerenciada de SQL do Azure.

  2. No Pesquisador de Objetos, selecione Gerenciamento > Eventos Estendidos. No Banco de Dados SQL do Azure, as sessões de eventos são definidas com o escopo do banco de dados e, portanto, a opção Eventos Estendidos está disponível em cada banco de dados, e não em Gerenciamento.

  3. Clique com o botão direito do mouse na pasta Sessões e selecione Nova Sessão.... A caixa de diálogo Nova Sessão... é preferível ao Assistente para Nova Sessão, embora os dois sejam semelhantes.

    Dica

    Nestas etapas do tutorial, não clique em OK até avançar por todas as quatro páginas: Geral, Eventos, Armazenamento de Dados e Avançado.

  4. Selecione a página Geral. Digite YourSession qualquer nome que desejar na caixa de texto Nome da sessão. Não selecione OK ainda, pois você precisa inserir alguns detalhes em outras páginas.

  5. Selecione a página Eventos.

  6. Na área Biblioteca de eventos, na lista suspensa, escolha Somente nomes de eventos.

    • Digite sql_statement na caixa de texto. Isso filtra a lista para mostrar apenas eventos com sql_statement no nome.
    • Role na tela e selecione o evento sql_statement_completed.
    • Selecione o botão de seta para a direita > para mover o evento para a caixa Eventos selecionados .
  7. Na página Eventos, selecione o botão Configurar. Isso abre a caixa Opções de configuração de eventos para os eventos selecionados.

    Captura de tela de novos eventos > de sessão > Selecione entre os eventos library. sql_statement_completed está selecionado. O botão de configuração é a próxima ação.

  8. Selecione a guia Filtro (Predicado). Em seguida, selecione a nova linha de filtro que diz Clique aqui para adicionar uma cláusula. Neste tutorial, configuraremos esse filtro (também conhecido como predicado) para capturar todas as SELECT instruções com uma HAVING cláusula.

  9. Na lista suspensa Campo, escolha sqlserver.sql_text.

    • Em Operador, escolha like_i_sql_unicode_string. Aqui, i no nome do operador significa que não há distinção entre maiúsculas e minúsculas.
    • Em Valor, digite %SELECT%HAVING%. Aqui, os sinais de porcentagem (%) são curingas que representam qualquer cadeia de caracteres.

    Observação

    Neste nome de duas partes do campo, sqlserver é o nome do pacote e sql_text é o nome do campo. O evento anterior que escolhemos, sql_statement_completed, precisa estar no mesmo pacote que o campo escolhido.

    Captura de tela de Nova Sessão > Eventos > Configurar > Filtro (Predicado) > Campo.

  10. Selecione a página Armazenamento de Dados.

  11. Na área Destinos, selecione a nova linha Tipo de Destino que diz Clique aqui para adicionar um destino. Neste tutorial, gravaremos nossos dados de eventos estendidos capturados em um arquivo de evento. Isso significa que os dados do evento são armazenados em um arquivo que pode ser aberto e visualizado posteriormente. A partir do SQL Server 2019 (15.x), os dados de evento também podem ser gravados para serem armazenados no Armazenamento do Azure, o padrão no SQL do Azure.

    • Na lista suspensa Tipo, escolha event_file.
  12. Na área Propriedades , digite o nome de arquivo e caminho completo na caixa de texto Nome de arquivo no servidor . Você também pode usar o botão Procurar. A extensão de nome de arquivo deve ser xel. Em nosso exemplo, usamos C:\temp\YourSession_Target.xel.

    Captura de tela de Nova Sessão > Armazenamento de Dados > Destinos > Tipo > event_file.

  13. Selecione a página Avançado. Por configuração padrão, esse destino .xel da sessão de evento estendido deve ter impacto mínimo ou nenhum impacto no desempenho do servidor, mas essas configurações na página Avançado podem ser usadas para aumentar ou diminuir os recursos e a latência.

    Captura de tela da nova sessão > avançada.

  14. Selecione o botão OK na parte inferior para criar essa sessão de evento.

  15. De volta ao Pesquisador de Objetos do SSMS, abra ou atualize a pasta Sessões e veja o novo nó da YourSession sessão de eventos estendidos. A sessão ainda não começou. Neste tutorial, vamos iniciá-lo mais tarde.

Editar uma sessão de evento no SSMS

No Pesquisador de Objetosdo SSMS, é possível editar a sessão de evento clicando com o botão direito do mouse em seu nó e selecionando Propriedades. A mesma caixa de diálogo com várias páginas é exibida.

Criar uma sessão de evento usando o T-SQL

No SSMS, você pode gerar um script T-SQL para criar sua sessão de evento da seguinte maneira:

  • Clique com o botão direito do mouse no nó da sessão do evento e selecione Sessão de Script como > CREATE para > Área de Transferência.
  • Cole em qualquer editor de texto.

Aqui está a instrução T-SQL CREATE EVENT SESSION gerada para YourSession:

CREATE EVENT SESSION [YourSession]
    ON SERVER -- For SQL Server and Azure SQL Managed Instance
    -- ON DATABASE -- For Azure SQL Database
    ADD EVENT sqlserver.sql_statement_completed
    (
        ACTION(sqlserver.sql_text)
        WHERE
        ( [sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text], N'%SELECT%HAVING%')
        )
    )
    ADD TARGET package0.event_file 
    (SET filename=N'C:\temp\YourSession_Target.xel');
GO

Observação

No Banco de Dados SQL do Azure, use ON DATABASE em vez de ON SERVER.

DROP condicional da sessão de evento

Antes da instrução CREATE EVENT SESSION, você pode executar condicionalmente uma instrução DROP EVENT SESSION, caso já exista uma sessão com o mesmo nome. Isso exclui a sessão existente. Sem isso, a tentativa de criar uma sessão com o mesmo nome gera um erro.

IF EXISTS (SELECT *
      FROM sys.server_event_sessions
      WHERE name = 'YourSession')
BEGIN
    DROP EVENT SESSION YourSession
          ON SERVER;
END
GO

Iniciar e parar a sessão de evento usando o T-SQL

Quando você cria uma sessão de evento, o padrão é que ela não inicie a execução automaticamente. Você pode iniciar ou interromper a sessão de evento a qualquer momento, usando a instrução T-SQL ALTER EVENT SESSION a seguir.

ALTER EVENT SESSION [YourSession]
      ON SERVER
    STATE = START; -- STOP;

Você tem a opção de configurar a sessão de evento para ser iniciada automaticamente quando a instância do mecanismo de banco de dados é iniciada. Veja a palavra-chave STARTUP STATE = ON em CREATE EVENT SESSION.

A interface do usuário do SSMS oferece uma caixa de seleção correspondente, Iniciar a sessão de evento na inicialização do servidor, na página Nova Sessão > Geral.

Testar uma sessão de evento

Teste sua sessão de evento com estas etapas:

  1. No Pesquisador de Objetos, clique com o botão direito do mouse no nó da sessão de evento e selecione Iniciar Sessão.
  2. Enquanto estiver conectado ao mesmo servidor (ou ao mesmo banco de dados no Banco de Dados SQL do Azure) no qual você criou a sessão de evento, execute a instrução SELECT...HAVING a seguir algumas vezes. Considere alterar o valor na cláusula HAVING para cada execução, alternando entre 2 e 3. Isso permite que você veja as diferenças nos resultados.
  3. Clique com o botão direito do mouse no nó da sessão e selecione Interromper Sessão.
  4. Leia a próxima subseção sobre como usar SELECT e exibir os resultados.
SELECT c.name,
    COUNT(*) AS [Count-Per-Column-Repeated-Name]
FROM sys.syscolumns AS c
INNER JOIN sys.sysobjects AS o
    ON o.id = c.id
WHERE o.type = 'V'
    AND c.name LIKE '%event%'
GROUP BY c.name
HAVING Count(*) >= 3 --2     -- Try both values during session.
ORDER BY c.name;

Para fins de completude, aqui está o exemplo de saída do SELECT...HAVING anterior.

/* Approximate output, 6 rows, all HAVING Count >= 3:
name                   Count-Per-Column-Repeated-Name
---------------------  ------------------------------
event_group_type       4
event_group_type_desc  4
event_session_address  5
event_session_id       5
is_trigger_event       4
trace_event_id         3
*/

Exibir dados da sessão de evento como XML

Em uma janela de consulta no SSMS, execute a instrução SELECT a seguir para ver os dados de evento capturados pela sessão. Cada linha representa uma ocorrência de evento. CAST(... AS xml) altera o tipo de dados da coluna de nvarchar para xml. Isso permite selecionar o valor da coluna para abri-lo em uma nova janela para facilitar a leitura.

Observação

O destino event_file sempre insere uma parte numérica no nome do arquivo xel. Antes de executar a consulta a seguir, você deve copiar o nome completo real do arquivo xel que inclui essa parte numérica e colá-lo na instrução SELECT. No exemplo a seguir, a parte numérica é _0_131085363367310000.

SELECT object_name,
    file_name,
    file_offset,
    event_data,
    'CLICK_NEXT_CELL_TO_BROWSE_XML RESULTS!' AS [CLICK_NEXT_CELL_TO_BROWSE_XML_RESULTS],
    CAST(event_data AS XML) AS [event_data_XML]
-- TODO: In the SSMS results grid, click this XML cell
FROM sys.fn_xe_file_target_read_file(
    'C:\Temp\YourSession_Target_0_131085363367310000.xel', NULL, NULL, NULL
);

Essa consulta fornece duas maneiras de exibir os resultados completos de qualquer linha de evento específica:

  • Execute SELECT no SSMS e selecione uma célula da coluna event_data_XML.

  • Copie a cadeia de caracteres XML de uma célula na coluna event_data. Cole em qualquer editor de texto, como Notepad.exe, e salve a o arquivo com a extensão xml. Em seguida, abra o arquivo em um navegador ou editor capaz de exibir dados XML.

Dados de eventos em XML

Em seguida, vemos uma parte dos resultados, que estão em formato XML. O XML a seguir é editado aqui para fins de brevidade. <data name="row_count"> exibe um valor de 6, que corresponde às nossas seis linhas de resultados exibidas anteriormente. Além disso, podemos ver a instrução SELECT inteira.

<event name="sql_statement_completed" package="sqlserver" timestamp="2016-05-24T04:06:08.997Z">
  <data name="duration">
    <value>111021</value>
  </data>
  <data name="cpu_time">
    <value>109000</value>
  </data>
  <data name="physical_reads">
    <value>0</value>
  </data>
  <data name="last_row_count">
    <value>6</value>
  </data>
  <data name="offset">
    <value>0</value>
  </data>
  <data name="offset_end">
    <value>584</value>
  </data>
  <data name="statement">
    <value>SELECT c.name,
            COUNT(*) AS [Count-Per-Column-Repeated-Name]
        FROM sys.syscolumns AS c
        INNER JOIN sys.sysobjects AS o
            ON o.id = c.id
        WHERE o.type = 'V'
            AND c.name LIKE '%event%'
        GROUP BY c.name
        HAVING Count(*) >= 3 --2     -- Try both values during session.
    ORDER BY c.name;</value>
      </data>
</event>

Exibir dados da sessão de evento no SSMS

Há vários recursos avançados na interface do usuário do SSMS que você pode usar para visualizar os dados capturados por uma sessão de evento. Para obter mais informações, consulte Exibir dados de eventos no SQL Server Management Studio.

Você pode começar com as opções do menu de contexto rotuladas Exibir Dados de Destino e Inspecionar Dados Dinâmicos.

Exibir dados de destino

No Pesquisador de Objetos do SSMS, você pode clicar com o botão direito do mouse no nó de destino que está no nó da sessão de evento, por exemplo, package0.event_counter. No menu de contexto, selecione Exibir Dados de Destino. O SSMS exibe os dados.

A exibição não é atualizada à medida que novos eventos ocorrem em uma sessão. Mas você pode selecionar Exibir Dados de Destino novamente.

Inspecionar dados dinâmicos

No Pesquisador de Objetosdo SSMS, é possível clicar com o botão direito do mouse no nó da sessão de evento. No menu de contexto, selecione Inspecionar Dados Dinâmicos. O SSMS exibe dados de entrada conforme sua chegada em tempo real.

Termos e conceitos nos eventos estendidos

A tabela a seguir lista os termos usados para eventos estendidos e descreve seus significados.

Termo Descrição
event session Um constructo centrado em torno de um ou mais eventos, além de itens de suporte como ações, são destinos. A instrução CREATE EVENT SESSION cria cada sessão de evento. Você pode usar ALTER em uma sessão de evento para iniciá-la e interrompê-la quando desejar.

Às vezes, uma sessão de evento é chamada de apenas uma sessão, quando o contexto esclarece que ela indica uma sessão de evento.
Mais detalhes sobre as sessões de eventos estão descritos em: Sessões de Eventos Estendidos.
event Uma ocorrência específica no sistema que é inspecionada por uma sessão de eventos ativos.

Por exemplo, o evento sql_statement_completed representa o momento em que se conclui qualquer instrução T-SQL. O evento pode relatar sua duração e outros dados.
target Um item que recebe os dados de saída de um evento capturado. O destino exibe os dados para você.

Alguns exemplos incluem o destino event_file usado anteriormente neste início rápido e o destino ring_buffer que mantém os eventos mais recentes na memória.
Qualquer tipo de destino pode ser usado para qualquer sessão de evento. Para obter detalhes, consulte Destinos de Eventos Estendidos.
action Um campo conhecido para o evento. Os dados do campo são enviados para o destino. O campo de ação está intimamente relacionado ao filtro de predicado.
predicate ou filtro Um teste de dados em um campo de evento, usado de forma que apenas um subconjunto interessante de ocorrências de eventos sejam enviados para o destino.

Por exemplo, um filtro pode incluir somente as ocorrências de eventos sql_statement_completed em que a instrução T-SQL contém a cadeia de caracteres HAVING.
package Um qualificador de nome anexado a cada item em um conjunto de itens centrado em torno de um núcleo de eventos.

Por exemplo, um pacote pode ter eventos sobre o texto T-SQL. Um evento pode tratar de todo o T-SQL em um lote. Enquanto isso, outro evento mais estreito designa instruções T-SQL individuais. Além disso, para qualquer instrução T-SQL, há eventos started e completed.
Os campos apropriados para os eventos também estão no pacote com os eventos. A maioria dos destinos está em package0 e é usada com eventos de vários outros pacotes.

Cenários e detalhes de uso de Eventos Estendidos

Há vários cenários para usar Eventos Estendidos para monitorar e solucionar problemas com o mecanismo de banco de dados e cargas de trabalho de consulta. Os artigos a seguir fornecem exemplos usando cenários relacionados a bloqueios:

Como descobrir eventos disponíveis em pacotes

A seguinte consulta retorna uma linha para cada evento disponível cujo nome contém as três cadeias de caracteres sql. Você pode editar a cláusula LIKE para procurar nomes de eventos diferentes. O conjunto de resultados também identifica o pacote que contém o evento.

SELECT -- Find an event you want.
    p.name AS [Package-Name],
    o.object_type,
    o.name AS [Object-Name],
    o.description AS [Object-Descr],
    p.guid AS [Package-Guid]
FROM sys.dm_xe_packages AS p
INNER JOIN sys.dm_xe_objects AS o
    ON p.guid = o.package_guid
WHERE o.object_type = 'event' --'action'  --'target'
    AND p.name LIKE '%'
    AND o.name LIKE '%sql%'
ORDER BY p.name,
    o.object_type,
    o.name;

O exemplo de resultado a seguir mostra a linha retornada, desviada aqui no formato de column name = value. Os dados referem-se ao evento sql_statement_completed usado nas etapas anteriores do exemplo. A descrição do objeto (um evento, neste exemplo) serve como uma cadeia de caracteres de documentação.

Package-Name = sqlserver
object_type  = event
Object-Name  = sql_statement_completed
Object-Descr = Occurs when a Transact-SQL statement has completed.
Package-Guid = 655FD93F-3364-40D5-B2BA-330F7FFB6491

Localizar eventos com a interface do usuário do SSMS

Outra opção para localizar eventos por nome é usar a caixa de diálogo Nova Sessão > Eventos > Biblioteca de Eventos, mostrada na captura de tela anterior. Você pode digitar um nome de evento parcial e encontrar todos os nomes de eventos correspondentes.

Classes de eventos do Rastreamento do SQL

Uma descrição do uso dos Eventos Estendidos com colunas e classes de evento do Rastreamento do SQL está disponível em: Exibir os Eventos Estendidos equivalentes às classes do Rastreamento do SQL.

ETW (Rastreamento de Eventos para Windows)

Descrições de como usar os Eventos Estendidos com o ETW (Rastreamento de Eventos para Windows) estão disponíveis em:

Sessões de eventos do sistema

No SQL Server e na Instância Gerenciada de SQL do Azure, várias sessões de eventos do sistema são criadas por padrão e configuradas para iniciar quando o mecanismo de banco de dados é iniciado. Como a maioria das sessões de eventos, elas consomem uma pequena quantidade de recursos e não afetam substancialmente o desempenho da carga de trabalho. A Microsoft recomenda que essas sessões permaneçam habilitadas e em execução. As sessões de integridade, especialmente a sessão system_health, são frequentemente úteis para monitoramento e solução de problemas.

Você pode ver essas sessões de evento no Pesquisador de Objetos do SSMS, em Gerenciamento > Eventos Estendidos > Sessões. Por exemplo, no SQL Server, essas sessões de eventos do sistema são:

  • AlwaysOn_health
  • system_health
  • telemetry_events

Provedor do PowerShell

Você pode gerenciar Eventos Estendidos usando o provedor do SQL Server PowerShell. Para obter mais informações, veja Usar o provedor do PowerShell para Eventos Estendidos.

Exibições do sistema

As exibições do sistema para os eventos estendidos incluem:

  • Exibições de catálogo: para obter informações sobre sessões de eventos definidas por CREATE EVENT SESSION.
  • Exibições de gerenciamento dinâmico (DMVs): para obter informações sobre sessões de eventos ativas (iniciadas).

SELECTs and JOINs From System Views for Extended Events in SQL Server (SELECTs e JOINs das exibições do sistema para eventos estendidos no SQL Server) fornece informações sobre:

  • Como unir as exibições
  • Várias consultas úteis com base nessas exibições
  • A correlação entre:
    • Visualizar colunas
    • CláusulasCREATE EVENT SESSION
    • A interface do usuário do SSMS

Apêndice: consultas para encontrar detentores de permissões de Eventos Estendidos

As permissões mencionadas neste artigo são:

  • ALTER ANY EVENT SESSION
  • VIEW SERVER STATE
  • CONTROL SERVER

A instrução SELECT...UNION ALL a seguir retorna linhas que mostram quem tem as permissões necessárias para criar sessões de evento e consultar as exibições do catálogo do sistema em busca de eventos estendidos.

-- Ascertain who has the permissions listed in the ON clause.
-- 'CONTROL SERVER' permission includes all lower permissions like
-- 'ALTER ANY EVENT SESSION' and 'VIEW SERVER STATE'.
SELECT 'Owner-is-Principal' AS [Type-That-Owns-Permission],
    NULL AS [Role-Name],
    prin.name AS [Owner-Name],
    PERM.permission_name COLLATE Latin1_General_CI_AS_KS_WS AS [Permission-Name]
FROM sys.server_permissions AS PERM
INNER JOIN sys.server_principals AS prin
    ON prin.principal_id = PERM.grantee_principal_id
WHERE PERM.permission_name IN (
    'CREATE ANY EVENT SESSION',
    'ALTER ANY EVENT SESSION',
    'VIEW SERVER PERFORMANCE STATE',
    'VIEW SERVER STATE',
    'CONTROL SERVER'
)
UNION ALL
-- Plus check for members of the 'sysadmin' fixed server role,
-- because 'sysadmin' includes the 'CONTROL SERVER' permission.
SELECT 'Owner-is-Role',
    prin.name, -- [Role-Name]
    CAST((IsNull(pri2.name, N'No members')) AS NVARCHAR(128)),
    NULL
FROM sys.server_role_members AS rolm
RIGHT JOIN sys.server_principals AS prin
    ON prin.principal_id = rolm.role_principal_id
LEFT JOIN sys.server_principals AS pri2
    ON rolm.member_principal_id = pri2.principal_id
WHERE prin.name = 'sysadmin';

função HAS_PERMS_BY_NAME

A instrução SELECT a seguir relata suas permissões. Ela utiliza a função interna HAS_PERMS_BY_NAME.

Além disso, se você tiver autoridade para representar temporariamente outros logons, poderá descomentar as instruções EXECUTE AS e REVERT para ver se outros logons possuem a ALTER ANY EVENT SESSION permissão.

--EXECUTE AS LOGIN = 'LoginNameHere';
SELECT HAS_PERMS_BY_NAME(NULL, NULL, 'ALTER ANY EVENT SESSION');
--REVERT;