DBAtlas · Atlas de operaciones de bases de datos

Forzar un buen plan o adjuntar un hint con 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;

Qué hace

Fuerza un plan concreto de Query Store para la consulta elegida; el optimizador usa ese plan en cada compilación. En 2022 también puede adjuntar hints como RECOMPILE, MAXDOP u OPTIMIZE FOR sin cambiar el código de la aplicación.

Cuándo usarlo

Cuando una regresión de plan necesita una solución urgente en producción, hasta que esté lista una solución permanente (índice, reescritura de la consulta, estadísticas).

Precaución

Un plan forzado puede degradarse al crecer los datos y no es una solución permanente; revíselo regularmente. Si se elimina/renombra un índice que usa el plan, el forzado falla (last_force_failure_reason_desc = NO_INDEX etc.) y la consulta se compila normalmente. Tras forzar, puede aparecer un plan "moralmente equivalente" con un nuevo plan_id; es lo esperado. El forzado funciona mientras Query Store está en READ_ONLY, pero verifíquelo tras una restauración o un failover de AG.

Abrir en DBAtlas →

Relacionado