用 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 故障转移后请验证。