Forcer un bon plan ou attacher un hint avec Query Store
SQL ServerQuery StoreCommande
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;Ce que fait la commande
Force un plan Query Store précis pour la requête choisie ; l'optimiseur utilise ce plan à chaque compilation. En 2022, vous pouvez aussi attacher des hints comme RECOMPILE, MAXDOP ou OPTIMIZE FOR sans modifier le code de l'application.
Quand l'utiliser
Quand une régression de plan nécessite une correction urgente en production, en attendant qu'une correction durable (index, réécriture de requête, statistiques) soit prête.
Attention
Un plan forcé peut se dégrader avec la croissance des données et n'est pas une correction durable ; réexaminez-le régulièrement. Si un index utilisé par le plan est supprimé/renommé, le forçage échoue (last_force_failure_reason_desc = NO_INDEX etc.) et la requête se compile normalement. Après forçage, un plan "moralement équivalent" peut apparaître sous un nouveau plan_id ; c'est attendu. Le forçage fonctionne pendant que Query Store est READ_ONLY, mais vérifiez après une restauration ou un basculement d'AG.