如果在可用性组中的主服务器上强制执行计划,它是否应用于在辅助服务器上运行的查询?
我正在寻找涵盖计划强制的两种可能性的答案:
我已阅读以下内容,这些内容表明 QS 强制计划不会延续,但在文档中找不到任何权威性内容或有关计划指南的任何内容。
- Erin Stellato 的查询存储和可用性组
- Vikas Rana在 AlwaysOn 可读辅助节点上查询数据存储强制计划行为
强制的确凿证据将是辅助节点的执行计划中存在Use Plan
orPlanGuideName
和PlanGuideDB
属性。
查询存储计划强制不会影响辅助节点上的查询
使用 Query Store 在主节点上强制执行计划看起来肯定会在辅助节点上强制执行计划。
我尝试在非产品服务器上运行查询,然后使用
sp_query_store_flush_db
(这是让数据同步到辅助服务器所必需的)刷新查询存储。这是左侧的辅助(注意关于“只读”的带圆圈的警告),右侧的主要:现在我点击右侧的“Force Plan”,然后刷新两个视图:
因此,“强制”至少在基础查询存储表中得以延续。这是有道理的,因为 OP 中引用的文章指出查询强制应该在故障转移后保持原位:
但是强迫行为真的发生了吗?我现在将在两台服务器上运行相同的查询。正如预期的那样,首先,计划 XML 中存在“UsePlan”属性:
在用户界面中:
在辅助服务器上(注意不同的服务器名称),该计划不是强制的。这是相同的计划 XML 片段:
计划指南不影响辅助查询
我使用此代码在主节点上创建了一个计划指南(更改了表名以保护无辜者):
当然,计划指南在初级阶段是有效的,正如执行计划所证明的那样:
我确实在这一点上确认了计划指南已复制到辅助服务器。
在辅助节点上运行相同的查询,执行计划缺少计划指南强制执行的所有迹象: