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) ouALTER 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.
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.
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.
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.
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.Selecione a página Eventos.
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 comsql_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 .
- Digite
Na página Eventos, selecione o botão Configurar. Isso abre a caixa Opções de configuração de eventos para os eventos selecionados.
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 umaHAVING
cláusula.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.
- Em Operador, escolha
Selecione a página Armazenamento de Dados.
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
.
- Na lista suspensa Tipo, escolha
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, usamosC:\temp\YourSession_Target.xel
.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.
Selecione o botão OK na parte inferior para criar essa sessão de evento.
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:
- No Pesquisador de Objetos, clique com o botão direito do mouse no nó da sessão de evento e selecione Iniciar Sessão.
- 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áusulaHAVING
para cada execução, alternando entre 2 e 3. Isso permite que você veja as diferenças nos resultados. - Clique com o botão direito do mouse no nó da sessão e selecione Interromper Sessão.
- 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ãoxml
. 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:
- Localizar os objetos que detêm a maioria dos bloqueios
- Esse cenário usa o destino histogram, que processa os dados brutos de evento antes de exibi-los para você de maneira resumida (classificada em buckets).
- Determinar quais consultas estão mantendo bloqueios
- Esse cenário usa o destino pair_matching, em que o par de eventos é
sqlserver.lock_acquire
esqlserver.lock_release
.
- Esse cenário usa o destino pair_matching, em que o par de eventos é
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:
- Destino do rastreamento de eventos para Windows
- Monitorar a atividade do sistema usando Eventos Estendidos
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áusulas
CREATE 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;