DBAtlas · Атлас эксплуатации баз данных

Принудительный хороший план или подсказка через 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.

Открыть в DBAtlas →

Связанные материалы