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 フェイルオーバーの後は確認する。