Entendendo Wait Types no SQL Server: um guia para iniciantes

Se você está começando sua jornada como DBA ou desenvolvedor SQL, entender wait types é essencial para diagnosticar gargalos de performance com precisão — sem adivinhar. Neste guia, você vai ver o que são waits, por que importam, como consultá-los e como interpretar os mais comuns.

O que são Wait Types no SQL Server?

Sempre que o SQL Server executa uma consulta, precisa de CPU, memória, disco e rede. Se algum desses recursos não está disponível no momento, a sessão entra em espera. O motivo específico da espera é registrado como um wait type.

Em outras palavras, waits são a forma do SQL Server dizer “o que estou esperando e onde está o atraso”. Ler esse “painel de avisos” ajuda você a encontrar o gargalo certo e priorizar a correção.

Uma analogia rápida (o banco)

Imagine uma fila no banco:

  • Você espera porque só há um caixa → pressão de CPU.
    Exemplo de wait: SOS_SCHEDULER_YIELD.

  • Você espera porque o caixa foi buscar um documento no arquivo morto → latência de I/O de disco.
    Exemplo de wait: PAGEIOLATCH_SH.

  • Você espera porque o cliente da frente ainda está no balcãobloqueio entre transações.
    Exemplos de waits: LCK_M_S, LCK_M_X.

Assim como o gerente do banco atua para acelerar o atendimento, o DBA usa os waits para agir no ponto certo do SQL Server.

Por que os Wait Types são importantes?

  • Solucionar consultas lentas com base em evidências.

  • Identificar gargalos de recurso (CPU, I/O, locks, rede).

  • Entender como o sistema está sendo usado.

  • Priorizar ações de tuning com impacto real.

Consulta útil para checar wait stats

Comece pelo básico, ordenando pelas maiores esperas acumuladas:

SELECT 
    wait_type, 
    wait_time_ms, 
    waiting_tasks_count
FROM sys.dm_os_wait_stats
ORDER BY wait_time_ms DESC;

⚠️ As métricas de sys.dm_os_wait_stats são cumulativas desde o último restart (ou desde um clear manual). Para análises confiáveis, colete após um período de carga representativo.

Versão prática (Top waits, %, e exclusão de waits “benignos”)

Muitas equipes ignoram waits de manutenção/ociosos para focar no que importa. Use um filtro simples e calcule a participação no total:

WITH waits AS (
    SELECT 
        wait_type,
        wait_time_ms,
        signal_wait_time_ms,
        waiting_tasks_count
    FROM sys.dm_os_wait_stats
    WHERE wait_type NOT LIKE 'SLEEP%'       -- ociosos
      AND wait_type NOT LIKE 'BROKER_%'     -- Service Broker
      AND wait_type NOT LIKE 'XE_%'         -- Extended Events
      AND wait_type NOT LIKE 'FT_IFTS%'     -- Full-Text
      AND wait_type NOT LIKE 'HADR_%'       -- AG/HA infra
      AND wait_type NOT LIKE 'SQLTRACE_%'   -- SQL Trace
      AND wait_type NOT IN (
           'LAZYWRITER_SLEEP',
           'REQUEST_FOR_DEADLOCK_SEARCH',
           'CLR_AUTO_EVENT','CLR_MANUAL_EVENT',
           'BROKER_RECEIVE_WAITFOR','DIRTY_PAGE_POLL'
      )
)
SELECT TOP (15)
    wait_type,
    wait_time_ms,
    signal_wait_time_ms,
    waiting_tasks_count,
    CAST(100.0 * wait_time_ms / SUM(wait_time_ms) OVER() AS DECIMAL(5,2)) AS pct_total_wait_time
FROM waits
ORDER BY wait_time_ms DESC;

Como interpretar waits comuns

  • CXPACKET / CXCONSUMER (paralelismo)
    Pode indicar excesso de paralelismo ou distribuição desigual.
    Ações: revisar MAXDOP, cost threshold for parallelism, planos e estatísticas.

  • PAGEIOLATCH_* (I/O de dados)
    Espera por páginas vindas do disco (latência de storage).
    Ações: checar IOPS/latência do storage, cache de buffer, índices e padrões de acesso.

  • LCK_M_* (locks/bloqueio)
    Uma sessão espera outra liberar um recurso.
    Ações: revisar transações longas, isolamento, missing indexes e padrões de escrita.

  • ASYNC_NETWORK_IO (rede/consumidor lento)
    O servidor espera o cliente consumir os resultados.
    Ações: otimizar paginação no cliente, reduzir linhas/colunas retornadas, checar rede.

  • SOS_SCHEDULER_YIELD (pressão de CPU)
    Threads cedendo scheduler por alta demanda de CPU.
    Ações: otimizar consultas e índices, revisar cardinalidade/estatísticas, avaliar capacidade de CPU.

Um fluxo simples de diagnóstico com waits

  1. Capturar waits (básico ou versão prática com %).

  2. Relacionar com sintomas (CPU alta? disco lento? bloqueios?).

  3. Cruzar com métricas (PerfMon, storage, Query Store, waits por sessão via sys.dm_os_waiting_tasks).

  4. Priorizar e testar mudanças (índices, parâmetros de paralelismo, ajustes de consulta, revisão de transações).

Conclusão

Wait types são o seu “mapa de calor” de onde o SQL Server perde tempo. Ao medir e interpretar esses sinais, você troca o chute por diagnóstico — e concentra esforços nas causas com maior retorno.

Fui, mas volto com mais SQL Server em breve!

✍️ Sobre o autor
O Prof. Landry é especialista em Microsoft SQL Server desde 1999, Microsoft Trainer, Professor Universitário e criador do canal SQL Server Expert no YouTube, com conteúdo técnico semanal para DBAs e profissionais de dados.

🚀 Quer aprender mais sobre SQL Server?
👉 Me acompanhe no LinkedIn e inscreva-se no canal para não perder nenhuma dica prática!

0
Subscribe to my newsletter

Read articles from SQL Server Expert directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

SQL Server Expert
SQL Server Expert

O Prof. Landry Duailibe é especialista em Microsoft SQL Server desde 1999, Microsoft Certified Trainer, professor universitário e criador do canal SQL Server Expert no YouTube, onde compartilha conteúdo técnico semanal para DBAs e profissionais de dados. Já ajudou milhares de alunos a evoluírem suas habilidades com SQL Server e conquistarem melhores oportunidades na área de dados.