我在查询存储中强制执行计划。计划与每天运行一次的作业中的程序相关联。这项工作的步骤之一就是:
EXEC [schema].[LoadData]
过程 [schema].[LoadData] 看起来像
TRUNCATE TABLE [schema].[Data];
INSERT INTO [schema].[Data]
([A1],
[A2],
.
.
.,
[A49]
)
SELECT *
,CURRENT_TIMESTAMP AS [Insert TimeStamp]
FROM [schema].[View]
其中 view 是一个包含一些 CTE 并使用同义词的视图(连接到来自不同数据库的表)。
要测试强制计划是否有效,我按照以下步骤操作:
- 在 SSMS 中运行查询 ->
EXEC [schema].[LoadData]
- 上面的执行被视为不同的查询,因此在查询存储中没有看到任何新的查询 = 7
- DBA 只需使用正在运行查询的步骤创建一个新作业 ->
EXEC [schema].[LoadData]
- 运行上述新创建的工作原因计划 ID = 29800
质疑为什么不强制执行计划?在“强制计划失败计数”列中为 0。
计划 id 29800 可能确实是强制的,但是查询存储使这很难看到。
计划强制不保证新计划与原始计划相同
sp_query_store_force_plan
,如(强调添加)中所述:如果生成的计划不相同,您将看到一个新的计划 ID。这并不一定意味着计划强制失败。当计划强制失败时,将
query_store_plan_forcing_failed
触发扩展事件。您可以通过查看元素中属性
UsePlan="1"
的id 为 29800 的计划 xml 来验证计划强制是否成功。QueryPlan
它也作为一个属性出现在图形计划的根部。计划 ID 29800 也将出现在“带有强制计划的查询”报告中。您可能想阅读 Erland Sommarskog 在他的文章中的解释:应用程序慢,SSMS 快?
Kendra Little 在什么是“道德等价的执行计划”以及为什么它好?
顺便说一句,SSMS 生成不同查询 id 的原因几乎可以肯定是因为您
SET QUOTED_IDENTIFIER ON
在工作步骤中没有,或者您将 SSMS 配置为SET ARITHABORT ON
(这是毫无意义的默认设置)。