쿼리 저장소 계획 적용은 보조의 쿼리에 영향을 미치지 않습니다.
Query Store를 사용하여 기본 계획을 강제로 계획 하면 보조 계획 을 강제로 계획하는 것처럼 보입니다 .
비영리 서버에서 쿼리를 실행 한 다음 쿼리 저장소를 플러시했습니다 sp_query_store_flush_db
(데이터를 보조 서버와 동기화하는 데 필요함). 다음은 왼쪽에있는 보조 ( "읽기 전용"에 대한 동그라미로 표시된 경고에 유의하십시오)와 오른쪽에있는 보조입니다.
이제 오른쪽의 "강제 계획"을 클릭 한 다음 두보기를 모두 새로 고칩니다.
따라서 "강제"는 최소한 기본 쿼리 저장소 테이블에서 이어졌습니다. OP에 인용 된 기사가 장애 조치 후에도 쿼리 강제 실행이 제자리에 남아 있어야한다는 점을 감안할 때 이는 의미가 있습니다.
질문 : QDS는 기본 복제본에서 보조 복제본으로 데이터베이스 장애 조치를 수행 할 때 FORCED Plan 정보를 유지합니까?
답변 : 예. QDS는 sys.query_store_plan 테이블에 강제 계획 정보를 저장하므로 장애 조치의 경우 새 기본에서 동일한 동작을 계속 볼 수 있습니다.
그러나 강제 행동은 실제로 발생합니까? 이제 두 서버에서 동일한 쿼리를 실행하겠습니다. 기본적으로 예상대로 "UsePlan"속성이 계획 XML에 있습니다.
<QueryPlan DegreeOfParallelism="1" MemoryGrant="11096" CachedPlanSize="288" CompileTime="82"
CompileCPU="78" CompileMemory="2104" UsePlan="true">
그리고 UI에서 :
보조 서버 (다른 서버 이름 참고)에서는 계획이 강제 실행되지 않았습니다 . 다음은 동일한 계획 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">