Forçar um plano bom ou anexar um hint com o Query Store
SQL ServerQuery StoreComando
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.