Answers:
使用查询存储在主数据库上强制执行计划肯定看起来像是在辅助数据库上强制执行计划。
我尝试在非产品服务器上运行查询,然后使用刷新查询存储sp_query_store_flush_db
(这是使数据同步到辅助服务器所必需的)。这是左侧的辅助按钮(请注意带圆圈的警告:“只读”),右侧是辅助按钮:
现在,单击右侧的“强制计划”,然后刷新两个视图:
因此,“强制”至少保留在基础查询存储表中。鉴于OP中引用的文章指出,在故障转移后查询强制应保留在原处:
问题:当数据库从主副本故障转移到辅助副本时,QDS是否会保留FORCED Plan信息?
答:是的,QDS将强制计划信息存储在sys.query_store_plan表中,因此,在进行故障转移的情况下,您将继续在新的主数据库上看到相同的行为。
但是强迫行为实际上发生了吗?现在,我将在两个服务器上运行相同的查询。在主数据库上,正如预期的那样,计划XML中包含“ UsePlan”属性:
<QueryPlan DegreeOfParallelism="1" MemoryGrant="11096" CachedPlanSize="288" CompileTime="82"
CompileCPU="78" CompileMemory="2104" UsePlan="true">
在用户界面中:
在辅助服务器上(请注意不同的服务器名称),该计划未强制执行。这是相同的计划XML代码段:
<QueryPlan DegreeOfParallelism="1" MemoryGrant="11096" CachedPlanSize="288" CompileTime="32"
CompileCPU="28" CompileMemory="1656">
我使用以下代码在主数据库上创建了一个计划指南(更改了表名以保护无辜者):
EXEC sp_create_plan_guide
@name = 'plan-guide-test',
@stmt = N'SELECT TOP (1000) *
FROM dbo.TableName t
WHERE
NOT EXISTS
(
SELECT NULL
FROM dbo.OtherTable o
WHERE t.Id = o.TableName
);',
@type = N'SQL',
@module_or_batch = NULL,
@hints = N'OPTION (MAXDOP 1)';
正如执行计划所证明的那样,该计划指南当然在主要方面有效:
<StmtSimple StatementCompId="1" StatementEstRows="1000" ... StatementType="SELECT"
PlanGuideDB="..._UAT" PlanGuideName="plan-guide-test" ...>
我确实确认了这一点,即计划指南已复制到第二份。
在辅助服务器上运行相同的查询时,执行计划缺少计划指南强制执行的所有迹象:
<StmtSimple StatementCompId="1" StatementEstRows="1000" ... StatementType="SELECT"
QueryHash="0xECF8A24F126EE77A" QueryPlanHash="0x0E93CF7FEAC1B6EA"
RetrievedFromCache="true" SecurityPolicyApplied="false">