SQL Server na prática

Capturar consultas lentas com Extended Events no SQL Server

Configure uma captura limitada, confirme unidades e arquivos de eventos e transforme observações de consultas lentas em testes objetivos.

Uma solicitação lenta intermitente é difícil de investigar depois que termina. Um plano de outra execução pode não explicar se o tempo foi gasto em CPU, leituras ou esperas. Uma sessão focada de Extended Events preserva evidências úteis sem registrar todos os detalhes de todas as instruções.

A pergunta escolhida é específica: quais solicitações concluídas em uma base levam pelo menos um segundo? Isso limita a coleta e encontra candidatos para análise. O exemplo usa uma instância SQL Server convencional; sessões de nuvem no nível de banco e outros destinos precisam de configuração própria.

Definir a captura antes de iniciar

Verifique os metadados na instância real em vez de presumir unidades.

SELECT object_name, name, type_name, description
FROM sys.dm_xe_object_columns
WHERE object_name IN (N'rpc_completed', N'sql_batch_completed')
  AND name IN (N'duration', N'cpu_time');

Nos eventos de conclusão RPC e batch usados aqui, duration está em microssegundos: 1.000.000 representa um segundo. Nem todos os campos de todos os eventos usam a mesma unidade. Preserve essa informação ao exportar.

A sessão filtra a base de ID 5. Troque pelo DB_ID da base desejada e substitua o caminho Windows por um diretório existente onde a conta de serviço possa gravar. Use um nome de sessão ainda disponível.

-- SQL Server instance example: replace database_id 5 and the file path.
CREATE EVENT SESSION AxialSlowRequestsDemo ON SERVER
ADD EVENT sqlserver.rpc_completed (
    ACTION(sqlserver.client_app_name, sqlserver.database_name,
           sqlserver.session_id, sqlserver.sql_text)
    WHERE ([duration] >= (1000000) AND [sqlserver].[database_id] = (5))
),
ADD EVENT sqlserver.sql_batch_completed (
    ACTION(sqlserver.client_app_name, sqlserver.database_name,
           sqlserver.session_id, sqlserver.sql_text)
    WHERE ([duration] >= (1000000) AND [sqlserver].[database_id] = (5))
)
ADD TARGET package0.event_file (
    SET filename = N'D:\XEvents\AxialSlowRequests.xel',
        max_file_size = (20), max_rollover_files = (4)
)
WITH (MAX_MEMORY = 4096 KB,
      EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS,
      MAX_DISPATCH_LATENCY = 5 SECONDS,
      STARTUP_STATE = OFF);
ALTER EVENT SESSION AxialSlowRequestsDemo ON SERVER STATE = START;

RPC cobre chamadas como execução de procedimentos por drivers; batch cobre blocos SQL enviados. Capturar ambos evita uma lacuna conforme a forma de envio da aplicação. Isso não torna as medidas equivalentes nem permite somar todas as durações sem considerar seu escopo.

O destino limita tamanho e rotação dos arquivos. Arquivos antigos podem ser removidos na rotação, portanto a captura é uma janela de diagnóstico, não um arquivo permanente. STARTUP_STATE OFF evita reiniciar automaticamente essa investigação temporária após uma reinicialização.

ALLOW_SINGLE_EVENT_LOSS aceita a possibilidade de perda de eventos. A sessão não deve ser descrita como auditoria exata. Monitore saúde e perdas quando a completude importar para a conclusão.

Ler evidências para escolher o próximo teste

Inspecione os arquivos usando o mesmo caminho.

SELECT object_name, CAST(event_data AS xml) AS EventXml
FROM sys.fn_xe_file_target_read_file(
    N'D:\XEvents\AxialSlowRequests*.xel', NULL, NULL, NULL
);

O XML contém horário, campos específicos do evento e ações selecionadas. Interprete os horários consistentemente, normalmente em UTC, ao correlacionar com logs da aplicação. Leia duração, CPU, leituras lógicas e texto conforme o esquema de cada evento.

Duração alta com pouco CPU sugere investigar esperas, bloqueios, armazenamento ou outros atrasos; não identifica uma causa sozinha. Muitas leituras podem indicar acesso excessivo. CPU alto pode justificar examinar planos e expressões. Relacione a solicitação ao plano e aos parâmetros realmente utilizados.

Eventos concluídos não explicam uma consulta que continua executando indefinidamente. Em um incidente ativo, examine solicitações e esperas atuais separadamente. Rede e renderização do cliente também ficam fora da duração de execução SQL registrada.

Texto SQL pode conter literais e dados sensíveis. Limite acesso aos arquivos, ações coletadas e retenção. Revise o conteúdo antes de enviar arquivos brutos a conversas de suporte com muitos participantes.

Encerrar e preservar a conclusão

Após reproduzir o problema ou alcançar o limite de tempo, pare e remova a sessão temporária.

ALTER EVENT SESSION AxialSlowRequestsDemo ON SERVER STATE = STOP;
DROP EVENT SESSION AxialSlowRequestsDemo ON SERVER;

Remover a definição não apaga os arquivos. Preserve a evidência necessária e aplique a política de retenção. Uma investigação futura não deve incluir acidentalmente arquivos antigos por um padrão de busca amplo demais.

Não comece com eventos de instrução em alto volume e planos completos de toda a instância. Amplie somente para responder a uma dúvida concreta e meça o impacto. Um filtro aparentemente pequeno pode capturar milhares de solicitações durante um incidente.

Registre base, período, limite, tipos de evento, perdas e hipótese. Em seguida, faça uma mudança direcionada ou colete a próxima medição necessária. Extended Events agrega valor quando conecta uma solicitação lenta real a uma explicação testável, não apenas quando produz mais um arquivo de rastreamento.

Referências técnicas: Microsoft Learn: Extended Events quick start · Microsoft Learn: CREATE EVENT SESSION · Microsoft Learn: Read event files.

Pergunte sobre este artigo

Tem alguma dúvida sobre este tema?

Conte o que você está avaliando ou onde encontrou dificuldades. Responderemos com uma recomendação prática.

Inquiries are not enabled in this preview.

Fazer uma pergunta sobre este artigo