DBAtlas · Atlas d'exploitation des bases de données

Forcer un bon plan ou attacher un hint avec Query Store

SQL ServerQuery Store

Commande

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.

Ouvrir dans DBAtlas →

Voir aussi