查询存储计划不强制并且没有失败原因

SEa*_*986 3 sql-server execution-plan query-store sql-server-2019

我在查询存储中强制执行了一个计划,如下所示

EXEC sys.sp_query_store_force_plan @query_id = 113366, @plan_id = 3687662

但是当我再次运行查询时,查询不使用该计划,也不显示failure_force_reason

以下查询显示该计划已被强制,并表明上次运行时强制没有失败

SELECT  plan_id,
        query_id,
        is_forced_plan,
        last_force_failure_reason_desc
FROM    sys.query_store_plan
WHERE   is_forced_plan = 1
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

以下查询显示了相关查询的最后一次运行时间,这向我证实,我确实重新运行了这个查询,并且它使用了与我强制执行的计划不同的计划:

SELECT  TOP 1
        q.query_id,
        p.plan_id,
        s.last_execution_time,
        SYSDATETIMEOFFSET() AS CurrentTime
FROM    sys.query_store_query q
        JOIN sys.query_store_plan p
            ON q.query_id = p.query_id
        JOIN sys.query_store_runtime_stats s
            ON s.plan_id = p.plan_id
WHERE   q.query_id = 113366
ORDER BY s.last_execution_time DESC
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

为什么查询存储似乎忽略了这个计划的力量?我可以利用任何扩展事件或其他故障排除工具来了解吗?

Zik*_*ato 6

它使用的计划与你试图强制执行的计划相似吗?

强制执行计划并不能保证确切的计划将被强制执行。它仍然可以使用道德上等效的计划。

文档摘录(重点是我的):

此功能强制生成的执行计划将与强制执行的计划相同或相似。由于生成的计划可能与 sys.sp_query_store_force_plan 指定的计划不同,因此计划的性能可能会有所不同。在极少数情况下,性能差异可能显着且为负;在这种情况下,管理员必须删除强制计划。

肯德拉·利特尔(Kendra Little)详细描述了这一点。