What’s new on SQL Server 2022 – WAIT_AT_LOW_PRIORITY


Quando falamos de manutenção de índices em tabelas grandes, especialmente em ambientes de produção com alta concorrência, um dos maiores desafios é evitar o impacto em transações ativas. Pensando nisso, o SQL Server 2022 oferece uma opção extremamente útil: WAIT_AT_LOW_PRIORITY, que torna a criação ou alteração de índices online mais inteligente e menos intrusiva.

Neste post, vamos entender o que é essa opção, como ela funciona e quando aplicá-la para garantir alta disponibilidade e desempenho.


O problema: bloqueios durante operações de índice online

Mesmo ao usar ONLINE = ON em operações de criação ou reconstrução de índice, o SQL Server precisa, em determinado momento, adquirir bloqueios compartilhados (S) ou até bloqueios de modificação de esquema (Sch-M). Esses bloqueios, embora geralmente sejam mantidos por um curto período, podem causar gargalos consideráveis em ambientes de alta concorrência, como:

  • Atrasos em transações de leitura e escrita
  • Aumento da latência em consultas
  • Possíveis timeouts
  • Queda na taxa de throughput

Isso é especialmente crítico em bancos com alta carga de trabalho ou transações de longa duração.


A solução: WAIT_AT_LOW_PRIORITY

Para contornar esses efeitos colaterais, o SQL Server introduziu a opção WAIT_AT_LOW_PRIORITY. Com ela, você pode controlar o comportamento da operação de índice online quando há bloqueios concorrentes, garantindo que o sistema continue fluindo enquanto a operação espera de forma “educada”.

Como funciona?

Ao usar WAIT_AT_LOW_PRIORITY, a operação de índice:

  • Espera por bloqueios usando prioridade baixa
  • Permite que outras transações de prioridade normal continuem executando normalmente
  • Só será iniciada se conseguir adquirir os bloqueios necessários dentro de um tempo limite (MAX_DURATION)

Caso o tempo de espera exceda, você define o que deve acontecer com a operação usando a cláusula ABORT_AFTER_WAIT.


Sintaxe

WAIT_AT_LOW_PRIORITY (
MAX_DURATION = <tempo_em_minutos>,
ABORT_AFTER_WAIT = [NONE | SELF | BLOCKERS]
)

Parâmetros:

  • MAX_DURATION: tempo máximo (em minutos) que a operação vai aguardar em baixa prioridade antes de agir. A palavra minutes é opcional e pode ser omitida.
  • ABORT_AFTER_WAIT:
    • NONE: continua esperando com prioridade normal.
    • SELF: cancela a própria operação de índice.
    • BLOCKERS: termina as sessões de usuário que estão bloqueando a operação.

Exemplo

CREATE INDEX IX_Clientes_Email
ON dbo.Clientes(Email)
WITH (
    ONLINE = ON,
    WAIT_AT_LOW_PRIORITY (
        MAX_DURATION = 10,
        ABORT_AFTER_WAIT = SELF
    )
);

A operação de índice tentará adquirir os bloqueios necessários por até 10 minutos em baixa prioridade. Se não conseguir, ela será cancelada automaticamente (SELF).


Monitorando a operação

Você pode acompanhar o comportamento das operações que usam WAIT_AT_LOW_PRIORITY por meio dos seguintes eventos estendidos:

  • lock_request_priority_state: mostra o estado de prioridade da requisição de bloqueio.
  • process_killed_by_abort_blockers: indica quando processos foram encerrados pela opção BLOCKERS.
  • ddl_with_wait_at_low_priority: rastreia comandos DDL que utilizam a cláusula.

Conclusão

A opção WAIT_AT_LOW_PRIORITY é um poderoso recurso do SQL Server que permite equilibrar manutenção proativa de índices com a manutenção da performance do sistema em tempo real. Ao usá-la corretamente, você evita bloqueios desnecessários, melhora a experiência dos usuários e mantém a integridade das operações administrativas.

Se você lida com tabelas grandes e ambientes com alta carga, considere implementar essa opção em seus scripts de manutenção. Ela pode ser a chave para um ambiente mais estável e previsível.


Deixe um comentário