Nesse artigo, iremos falar sobre essa feature que está disponível desde o SQL Server 2008 e, que muitos a consideram como o substituto do SQL Server Profiler e Trace.
Essa feature foi projetada do zero, utilizando funcionalidades disponíveis tanto no Profiler quanto no Trace. Da forma como foi projetada, facilita que novos eventos possam ser adicionados. Novas features do SQL Server como AlwaysOn e ColumnStore Index, já tiveram seus eventos incluídos no Extended Events, confirmando que o projeto segue no caminho correto e, até o presente momento (SQL Server 2022), temos 26.449 eventos, enquanto o Profiler segue sem atualizações e com apenas 180 eventos. Mesmo com tantos eventos, o Extended Events tem menos sobrecarga de recursos que as ferramentas citadas acima.
Em seu lançamento, no SQL Server 2008, não existia uma interface amigável para criação/gerenciamento, sendo assim, era necessário utilizar comandos T-SQL para criar/gerenciar os mesmos. Mas, a partir do SQL Server 2012 foi introduzida uma interface que permitia criar os eventos e realizar algumas análises, a partir do SSMS v17 foi adicionado o XEvent Profiler, permitindo configurar um monitoramento em tempo real.
Depois de um breve resumo, vamos explorar um pouco a arquitetura dessa feature, que está dividida em 5 partes:
1 – Extended Events Packages
Trata-se de um container para os objetos do Extended Events, contém todos os metadados dos objetos existentes e, ao criar uma session de Extended Events poderá usar um ou mais pacotes disponíveis. Para saber quais pacotes estão disponíveis, utilizamos a sys.dm_xe_packages.
Para criarmos um monitoramento do SQL Server, na sua maioria, poderemos utilizar um dos seguintes pacotes:
– package0: Pacote default;
– sqlserver: Eventos do SQL Server;
– sqlos: Eventos do SQL Server Operating System.
Um pacote poderá conter:
– Events:
Trata-se do ponto de execução que esteja interessado em rastrear.
– Targets:
Trata-se do consumidor do evento. Existem vários destinos, para o modo assíncrono (Event file, Event pairing, Histograma, Ring buffer), já para o modo síncrono (Event Tracing para Windows, Event Counter).
– Actions:
Resposta programada a um evento. Actions devem estar vinculadas a um evento e cada evento pode ter seu próprio conjunto exclusivo de ações.
– Types:
Definição do que está contido na sequência de dados do evento.
– Predicates:
Conjuntos de regras para avaliar eventos quando são acionados, permitindo filtrar dados capturados.
– Maps:
Tabela de mapeamento que contém um número interno para uma sequência descritiva. Para verificar o mapeamento temos a sys.dm_xe_map_values.
2 – Extended Events Targets:
São os consumidores de eventos. Os eventos são consumidos por um target, de forma síncrona ou assíncrona. Uma sessão de Extended Events síncrono que esteja causando lentidão, e assim impactando o desempenho do banco de dados, será desconectada automaticamente.
3 – Extended Events Engine:
Permite definir os eventos, processamento de eventos, gerencia serviços e objetos.
4 – Extended Events Sessions:
Criada no processo do SQL Server que hospeda o mecanismo do Extended Events.
5 – Extended Events Tools:
Para criar um Extended Events, temos as seguintes ferramentas:
-T-SQL
-SSMS: através da interface Management – Extended Events
-SQL Server Powershell Provider
A finalidade desse artigo é lhe deixar familiarizado com essa feature, e o mais importante, lhe desafiar a conhecer mais sobre essa poderosa forma de monitorar, pois é muito útil para o dia a dia de qualquer DBA.
Abaixo, temos um código de exemplo que realiza coleta de todos os comandos, procedures (sp_statement_completed) e ad-hoc (sql_statement_completed) com um tempo de execução (duration) maior que 10 segundos:
CREATE EVENT SESSION [XE_QueryLongRun] ON SERVER
— Evento relacionado ao sqlserver, nesse caso, coleta de comandos de Stored Procedure
ADD EVENT sqlserver.sp_statement_completed(
— Action dentro do evento responsável por coletar comandos referentes a SP
ACTION (package0.collect_system_time,sqlserver.client_app_name,sqlserver.client_hostname, sqlserver.database_name,sqlserver.nt_username, sqlserver.session_id, sqlserver.plan_handle, sqlserver.query_hash,sqlserver.sql_text)
where duration > 10000000 — 10 segundos),
— Evento relacionado ao sqlserver, nesse caso, coleta de comandos de Adhoc
ADD EVENT sqlserver.sql_statement_completed(
— Action dentro do evento responsável por coletar comandos referentes a Adhoc
ACTION(package0.collect_system_time,sqlserver.client_app_name,sqlserver.client_hostname, sqlserver.database_name,sqlserver.nt_username,sqlserver.session_id, sqlserver.plan_handle, sqlserver.query_hash,sqlserver.sql_text
)
where duration > 10000000 — 10 segundos
)
— O Target, será assíncrono e o arquivo estará C:\XE com uma latência de 5 segundos
ADD TARGET package0.asynchronous_file_target
(SET filename = N’C:\XE\XE_QueryLongRun.xel’,metadatafile = N’C:\XE\XE_QueryLongRun.xem’,max_file_size=(65536),max_rollover_files=5)
WITH (MAX_DISPATCH_LATENCY = 5SECONDS, START=ON)
GO
— Comando para iniciar a session
ALTER EVENT SESSION [XE_QueryLongRun] ON SERVER
STATE = START;
Por hoje era isso pessoal, até o próximo post! 😊