Partilhar via


Início Rápido: Eventos Estendidos

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBase de dados SQL no Microsoft Fabric

Eventos estendidos é um recurso leve de monitoramento de desempenho que permite aos usuários coletar dados para monitorar e solucionar problemas. Usando 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 SQL que são novos em Eventos Estendidos e que desejam começar a usá-lo e ver os dados do evento em apenas alguns minutos.

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

Depois de ler este artigo, você pode:

  • Veja como criar uma sessão de evento no SQL Server Management Studio (SSMS), 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 a sessão do seu evento.
  • Compreender os resultados da sessão, incluindo:
    • Opções disponíveis para armazenamento de resultados
    • Resultados processados versus resultados brutos
    • Ferramentas para visualizar os resultados de diferentes maneiras e em diferentes escalas de tempo
  • Veja como pode pesquisar e descobrir todos os eventos disponíveis.
  • Compreenda as relações entre as visualizações do sistema de Eventos Estendidos.

Sugestão

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

Pré-requisitos

Para começar, você precisa:

  • Instale a versão mais recente do SQL Server Management Studio (SSMS).
  • Verifique se sua conta tem CREATE ANY EVENT SESSION (introduzida no SQL Server 2022) ou ALTER ANY EVENT SESSIONpermissão de servidor.
  • Além disso, ao usar o SSMS e para exibir sessões que são criadas, o login requer a permissão VIEW SERVER PERFORMANCE STATE.
  • Para o Banco de Dados SQL do Azure, a Instância Gerenciada SQL do Azure e o Banco de Dados SQL na Malha, os ficheiros de eventos dos Eventos Estendidos são armazenados no Armazenamento Azure. Você precisará de uma conta de armazenamento do Azure.

Detalhes sobre segurança e permissões relacionadas a eventos estendidos estão disponíveis no final deste artigo no Apêndice.

Eventos estendidos no SSMS

O SSMS fornece uma interface do usuário (UI) totalmente funcional para eventos estendidos. Muitos cenários podem ser realizados usando essa interface do usuário, sem precisar usar T-SQL ou exibições de gerenciamento dinâmico (DMVs).

Na próxima seção, você pode ver as etapas da interface do usuário para criar uma sessão de Eventos Estendidos e ver os dados relatados. Depois de passar pelas etapas práticas ou revisá-las neste artigo, você pode ler sobre os conceitos envolvidos nas etapas para uma compreensão mais profunda.

Criar uma sessão de evento no SSMS

Ao criar uma sessão de Eventos Estendidos, você informa ao sistema:

  • Em que eventos está interessado.
  • Como pretende que o sistema lhe comunique os dados.

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

  • General
  • Events
  • 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 devem ser relevantes para a explicação de conceitos básicos.

  1. Conecte-se a uma instância do mecanismo de banco de dados. Os Eventos Estendidos são suportados a partir do SQL Server 2014 (12.x), no Banco de Dados SQL do Azure e na Instância Gerenciada SQL do Azure.

  2. No Pesquisador de Objetos, selecione Management > Extended Events. No Banco de Dados SQL do Azure, as sessões de eventos têm escopo de banco de dados, portanto, a opção Eventos Estendidos é encontrada em cada banco de dados, 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 de Nova Sessão, embora os dois sejam semelhantes.

    Sugestão

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

  4. Selecione a página Geral . Em seguida, digite YourSession, ou qualquer nome que desejar, na caixa de texto Nome da sessão . Não selecione OK ainda, porque você ainda 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 o nome.
    • Desloque-se e selecione o evento denominado sql_statement_completed.
    • Selecione o botão > de seta para a direita para mover o evento para a caixa Eventos selecionados .
  7. Permanecendo na página Eventos , selecione o botão Configurar . Isso abre a caixa Opções de configuração do evento para os eventos selecionados.

    > Events > Select from the events library. sql_statement_completed is selected. The configure button is the next action.

  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, configurar-se-á este filtro (também conhecido como predicado) para obter todas as instruções SELECT com uma cláusula HAVING.

  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 é insensível a 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

    No termo composto do campo, sqlserver é o nome do pacote e sql_text é o nome do campo. O evento que escolhemos anteriormente, sql_statement_completeddeve estar no mesmo pacote que o campo que escolhemos.

    Captura de ecrã 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, escreveremos 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 podemos abrir e visualizar mais tarde. A partir do SQL Server 2019 (15.x), os dados do evento também podem ser gravados para serem armazenados no Armazenamento do Azure. Para o Banco de Dados SQL do Azure, a Instância Gerenciada SQL do Azure e o Banco de Dados SQL na Malha, os arquivos de evento são sempre armazenados no Armazenamento do Azure.

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

    Captura de ecrã de novos destinos > de armazenamento de > dados de sessão > Tipo > event_file.

  13. Selecione a página Avançado . Por padrão, esse destino .xel da sessão de evento estendida deve ter impacto mínimo ou nenhum 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 ecrã de Nova Sessão > Avançada.

  14. Selecione o botão OK na parte inferior para criar esta 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 estendida. 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 Objetos do SSMS, você pode editar sua sessão de evento clicando com o botão direito do mouse em seu nó e selecionando Propriedades. A mesma caixa de diálogo de várias páginas é exibida.

Criar uma sessão de evento usando 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 > CRIAR para > área de transferência.
  • Cole em qualquer editor de texto.

Aqui está a instrução T-SQL gerada CREATE EVENT SESSION 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 do evento

Antes da CREATE EVENT SESSION instrução, você pode executar condicionalmente uma DROP EVENT SESSION instrução, caso já exista uma sessão com o mesmo nome. Isso exclui a sessão existente. Sem isso, tentar criar uma sessão com o mesmo nome causa 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 eventos usando T-SQL

Quando você cria uma sessão de evento, o padrão é que ela não comece a ser executada automaticamente. Você pode iniciar ou parar sua sessão de evento a qualquer momento usando a seguinte ALTER EVENT SESSION instrução T-SQL.

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

Você tem a opção de configurar a sessão de eventos para iniciar automaticamente quando a instância do mecanismo de banco de dados for iniciada. Veja a STARTUP STATE = ON palavra-chave 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 do 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) onde você criou a sessão de evento, execute a instrução a seguir SELECT...HAVING algumas vezes. Considere alterar o valor na HAVING cláusula 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 Parar sessão.
  4. Leia a próxima subseção sobre como SELECIONAR e visualizar 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 maior clareza, aqui está o exemplo de saída do SELECT...HAVING precedente.

/* 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 do evento como XML

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

Observação

O event_file destino sempre insere uma parte numérica no nome do xel arquivo. Antes de executar a consulta a seguir, você deve copiar o xel nome completo real do arquivo que inclui essa parte numérica e colá-lo na SELECT instrução. 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
);

Esta consulta fornece duas maneiras de exibir os resultados completos de qualquer linha de evento:

  • Execute o SELECT no SSMS e, em seguida, selecione uma célula na event_data_XML coluna.

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

Dados do evento em XML

Em seguida, vemos parte dos resultados, que estão em formato XML. O XML a seguir é editado para ser breve. <data name="row_count"> exibe um valor de 6, que corresponde às nossas seis linhas de resultados exibidas anteriormente. Podemos ver toda a SELECT declaração.

<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 eventos no SSMS

Há vários recursos avançados na interface do usuário do SSMS que você pode usar para exibir 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ê começa com as opções do menu de contexto rotuladas Exibir dados de destino e Assistir dados ao vivo.

Ver dados de destino

No Explorador de Objetos do SSMS, você pode clicar com o botão direito do mouse no nó de destino que se encontra sob o nó da sessão de eventos, 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.

Assista a dados ao vivo

No Explorador de Objetos do SSMS, você pode clicar com o botão direito do mouse no nó da sessão de evento. No menu de contexto, selecione Watch Live Data. O SSMS apresenta os dados recebidos à medida que continuam a chegar em tempo real.

Termos e conceitos em Eventos Estendidos

A tabela a seguir lista os termos usados para Eventos Estendidos e descreve seus significados.

Term Description
event session Uma construção centrada em torno de um ou mais eventos, além de itens de apoio como ações são alvos. A instrução CREATE EVENT SESSION cria cada sessão de evento. Você pode ALTER iniciar uma sessão de evento para iniciá-la e pará-la à vontade.

Uma sessão de evento às vezes é referida como apenas uma sessão, quando o contexto esclarece que significa 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 é observada por uma sessão de evento ativa.

Por exemplo, o sql_statement_completed evento representa o momento em que qualquer instrução T-SQL é concluída. 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 alvo exibe os dados para si.

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

Por exemplo, um filtro pode incluir apenas as sql_statement_completed ocorrências de eventos em que a instrução T-SQL continha a cadeia de caracteres HAVING.
package Um qualificador de nome associado a cada item num conjunto de itens que se concentra em torno de um núcleo de acontecimentos.

Por exemplo, um pacote pode ter eventos sobre texto T-SQL. Um evento pode ser sobre todo o T-SQL em um conjunto. Enquanto isso, outro evento mais restrito é sobre instruções T-SQL individuais. Além disso, para qualquer instrução T-SQL, existem started e completed eventos.
Os campos apropriados para os eventos também estão no pacote com os eventos. A maioria dos alvos está dentro package0 e são usados com eventos de muitos outros pacotes.

Cenários de eventos estendidos e detalhes de uso

Há vários cenários para usar Eventos Estendidos para monitorar e solucionar problemas do mecanismo de banco de dados e consultar cargas de trabalho. Os artigos a seguir fornecem exemplos usando cenários relacionados ao bloqueio:

Como descobrir eventos disponíveis em pacotes

A consulta a seguir retorna uma linha para cada evento disponível cujo nome contém a cadeia de caracteres de três caracteres sql. Você pode editar a LIKE cláusula para pesquisar 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, pivotada aqui para o formato de column name = value. Os dados são do sql_statement_completed evento que foi usado nas etapas de exemplo anteriores. 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 usando a interface do usuário do SSMS

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

Classes de evento de Rastreio SQL

Uma descrição do uso de Eventos Estendidos com classes e colunas de eventos de Rastreamento SQL está disponível em: Exibir os Eventos Estendidos Equivalentes a Classes de Eventos de Rastreamento SQL.

Rastreamento de eventos para Windows (ETW)

As descrições do uso de Eventos Estendidos com Rastreamento de Eventos para Windows (ETW) estão disponíveis em:

Sessões de eventos do sistema

No SQL Server e na Instância Gerenciada 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 materialmente o desempenho da carga de trabalho. A Microsoft recomenda que essas sessões permaneçam habilitadas e em execução. As sessões de saúde, particularmente a sessão system_health, geralmente são úteis para monitorização e solução de problemas.

Você pode ver essas sessões de eventos no Pesquisador de Objetos do SSMS em Sessões de Eventos Estendidos > de Gerenciamento>. 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, consulte Usar o provedor do PowerShell para eventos estendidos.

Vistas de sistema

As visualizações do sistema para Eventos Estendidos incluem:

  • Visualizações do catálogo: para informações sobre sessões de eventos definidas pelo CREATE EVENT SESSION.
  • Visões de Gerenciamento Dinâmico (DMVs): para informações sobre sessões de eventos ativas (iniciadas).

SELECTs e JOINs de visões do sistema para Eventos Estendidos no SQL Server fornece informações sobre:

  • Como aderir às vistas
  • Várias consultas úteis com base nestes pontos de vista
  • A correlação entre:
    • Ver colunas
    • CREATE EVENT SESSION cláusulas
    • A interface do usuário do SSMS

Apêndice: Consultas para localizar titulares de permissão de Evento Estendido

As permissões mencionadas neste artigo são:

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

A instrução a seguir SELECT...UNION ALL retorna linhas que mostram quem tem as permissões necessárias para criar sessões de eventos e consultar as exibições do catálogo do sistema para 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 a seguir SELECT relata suas permissões. Ele depende da função interna HAS_PERMS_BY_NAME.

Além disso, se tiveres autoridade para assumir a identidade temporariamente de outros logins, podes descomentar as instruções EXECUTE AS e REVERT, para ver se outros logins possuem a permissão ALTER ANY EVENT SESSION.

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