SQL Server na prática

Medir esperas do SQL Server no intervalo do incidente

Use diferenças entre amostras em vez de totais históricos e relacione esperas do SQL Server às requisições afetadas durante um incidente.

A maior espera acumulada do servidor não explica necessariamente por que a aplicação ficou lenta às 10h15. O total pode incluir semanas de manutenção, trabalho de fundo e uma carga que deixou de existir. Para investigar um incidente curto, meça a mudança dentro daquele período e relacione-a às requisições afetadas.

Subtrair amostras sem limpar estatísticas

O script captura duas amostras com dez segundos de intervalo e subtrai contadores cumulativos. Ele não limpa estatísticas compartilhadas. Execute com as permissões adequadas: geralmente VIEW SERVER STATE antes do SQL Server 2022 e VIEW SERVER PERFORMANCE STATE a partir dessa versão.

SELECT wait_type, waiting_tasks_count, wait_time_ms, signal_wait_time_ms
INTO #WaitBefore
FROM sys.dm_os_wait_stats;

WAITFOR DELAY '00:00:10';

SELECT
    w.wait_type,
    w.waiting_tasks_count - b.waiting_tasks_count AS waits_started,
    w.wait_time_ms - b.wait_time_ms AS wait_ms,
    w.signal_wait_time_ms - b.signal_wait_time_ms AS signal_ms,
    (w.wait_time_ms - b.wait_time_ms)
      - (w.signal_wait_time_ms - b.signal_wait_time_ms) AS resource_ms
INTO #WaitDelta
FROM sys.dm_os_wait_stats AS w
JOIN #WaitBefore AS b ON b.wait_type = w.wait_type;

IF EXISTS
(
    SELECT 1 FROM #WaitDelta
    WHERE waits_started < 0 OR wait_ms < 0 OR signal_ms < 0
)
    THROW 50001, 'Counters changed incompatibly; discard this sample.', 1;

SELECT TOP (20) *
FROM #WaitDelta
WHERE wait_ms > 0
ORDER BY wait_ms DESC;

DROP TABLE #WaitDelta;
DROP TABLE #WaitBefore;

WAITFOR apenas define o intervalo e contribui com sua própria espera. Por isso a demonstração mantém todas as categorias visíveis, sem uma lista supostamente universal de exclusões. Um coletor permanente deve guardar horário UTC, identidade do servidor e início do mecanismo. Amostras agendadas separadamente costumam ser preferíveis a manter uma sessão aguardando.

Diferenças negativas mostram que as amostras não podem ser comparadas, frequentemente porque alguém zerou os contadores. Uma reinicialização normalmente também encerra esta sessão e suas tabelas temporárias. Um coletor persistente precisa detectar explicitamente o novo início do mecanismo.

A verificação não identifica todo reset: um contador zerado pode crescer além do valor antigo antes da segunda amostra. Coordene as práticas de limpeza e preserve o contexto. Não subtraia max_wait_time_ms para calcular um máximo do intervalo. Se o máximo histórico continua em 20 segundos, uma nova espera de 19 segundos fica invisível nessa subtração.

Entender as unidades antes de classificar

O tempo total inclui o tempo de sinal. Subtraí-lo produz o componente de espera de recurso representado pelos contadores. Tempo de sinal corresponde ao atraso entre estar pronto para executar e efetivamente executar. Valores altos precisam ser relacionados à fila executável e à demanda de CPU, sem uma conclusão automática.

Os milissegundos acumulados representam tempo de workers, não tempo de relógio. Dez tarefas esperando um segundo cada podem somar aproximadamente dez segundos em apenas um segundo real. Paralelismo e concorrência permitem totais maiores que a janela. Dividir esse total pela duração não gera um percentual convencional de utilização.

Contagem e duração também atravessam os limites das amostras de formas diferentes. A contagem aumenta no início da espera, enquanto a duração concluída aparece depois. Uma média calculada com diferenças de um intervalo curto pode enganar ou ter denominador zero. Para uma distribuição precisa, use eventos individuais.

Algumas esperas representam coordenação normal de tarefas de fundo. Filtrá-las facilita a leitura de um painel, mas preserve as amostras originais e documente o filtro. Uma categoria removida em uma análise pode importar em outra. Removê-la também muda os percentuais restantes sem alterar o trabalho realizado.

Relacionar a espera ao trabalho responsável

Aumento de esperas de locks direciona a investigação para bloqueadores, idade das transações e objetos afetados. PAGEIOLATCH leva às leituras de páginas e ao volume de E/S solicitado. PAGELATCH trata de sincronização em memória e não justifica automaticamente comprar discos. ASYNC_NETWORK_IO também pode indicar consumo lento pelo cliente.

Durante uma paralisação ativa, consulte sys.dm_os_waiting_tasks e as requisições atuais. Uma espera longa ainda em andamento pode não estar totalmente incluída nas durações concluídas. Registre a cadeia de bloqueio e os identificadores enquanto as transações ainda existem.

Valide a mudança em uma janela comparável. Guarde volume de requisições, mistura de operações de negócio e latência percebida junto das diferenças. Menos esperas em um servidor simplesmente mais tranquilo não comprova melhoria. A conclusão útil identifica qual trabalho estava limitado e demonstra que a mesma quantidade de atividade termina com menos atraso.

Referências técnicas: Microsoft Learn: Wait statistics · Microsoft Learn: Waiting tasks.

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