DBAtlas · Atlas de operações de banco de dados

Forçar um plano bom ou anexar um hint com o Query Store

SQL ServerQuery Store

Comando

USE [Musteri];
-- Force the good plan (query_id / plan_id from the regression query):
EXEC sys.sp_query_store_force_plan @query_id = 42, @plan_id = 7;

-- Forced plans and failure reason:
SELECT p.query_id, p.plan_id, p.is_forced_plan, p.plan_forcing_type_desc,
       p.force_failure_count, p.last_force_failure_reason_desc
FROM   sys.query_store_plan p
WHERE  p.is_forced_plan = 1;

-- Undo:
EXEC sys.sp_query_store_unforce_plan @query_id = 42, @plan_id = 7;

-- 2022+: attach / remove a hint without changing code:
EXEC sys.sp_query_store_set_hints @query_id = 42, @query_hints = N'OPTION (RECOMPILE)';
SELECT query_id, query_hint_text, last_query_hint_failure_reason_desc
FROM   sys.query_store_query_hints;
EXEC sys.sp_query_store_clear_hints @query_id = 42;

O que faz

Força um plano específico do Query Store para a consulta escolhida; o otimizador usa esse plano em toda compilação. No 2022, como alternativa, você pode anexar hints como RECOMPILE, MAXDOP ou OPTIMIZE FOR sem alterar o código da aplicação.

Quando usar

Quando uma regressão de plano precisa de correção urgente em produção, até que uma correção definitiva (índice, reescrita da consulta, estatísticas) esteja pronta.

Atenção

Um plano forçado pode degradar à medida que os dados crescem e não é uma correção definitiva; revise-o regularmente. Se um índice usado pelo plano for removido/renomeado, o forcing falha (last_force_failure_reason_desc = NO_INDEX etc.) e a consulta compila normalmente. Após o forcing, um plano "moralmente equivalente" pode aparecer com um novo plan_id; isso é esperado. O forcing funciona enquanto o Query Store está em READ_ONLY, mas verifique após um restore ou failover do AG.

Abrir no DBAtlas →

Relacionados