Принудительный хороший план или подсказка через Query Store
SQL ServerQuery StoreКоманда
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;Что делает
Принудительно задаёт для выбранного запроса конкретный план Query Store; оптимизатор использует его при каждой компиляции. В 2022 можно также прикрепить подсказки, такие как RECOMPILE, MAXDOP или OPTIMIZE FOR, без изменения кода приложения.
Когда использовать
Когда регрессия плана требует срочного исправления на продакшене, пока не готово постоянное решение (индекс, переписывание запроса, статистика).
Внимание
Принудительный план может деградировать по мере роста данных и не является постоянным решением; регулярно пересматривайте его. Если используемый планом индекс удалён/переименован, принудительное применение не срабатывает (last_force_failure_reason_desc = NO_INDEX и т. п.), и запрос компилируется обычным образом. После принудительного применения под новым plan_id может появиться "морально эквивалентный" план; это ожидаемо. Принудительное применение работает, пока Query Store в READ_ONLY, но проверяйте его после восстановления или отработки отказа AG.