การบังคับใช้แผนร้านค้า Query จะไม่ส่งผลต่อข้อความค้นหาในรอง
การใช้ Query Store เพื่อบังคับแผนในหลักดูเหมือนว่าจะบังคับแผนในรอง
ฉันพยายามเรียกใช้แบบสอบถามบนเซิร์ฟเวอร์ที่ไม่ได้ผลิตแล้วล้างเก็บแบบสอบถามด้วยsp_query_store_flush_db
(ซึ่งจำเป็นต้องได้รับข้อมูลเพื่อซิงค์ข้ามไปยังรอง) นี่คือลำดับที่สองทางด้านซ้าย (โปรดสังเกตคำเตือนที่เป็นวงกลมเกี่ยวกับการเป็น "อ่านอย่างเดียว") และข้อความทางด้านขวา
ตอนนี้ฉันจะคลิก "บังคับแผน" ทางด้านขวาแล้วรีเฟรชมุมมองทั้งสอง:
ดังนั้น "บังคับ" ดำเนินการอย่างน้อยในตารางร้านค้าแบบสอบถามพื้นฐาน สิ่งนี้สมเหตุสมผลเนื่องจากบทความที่ยกมาใน OP ทำให้ประเด็นที่การบังคับใช้แบบสอบถามควรยังคงอยู่หลังจากที่ล้มเหลว:
คำถาม: QDS จะเก็บข้อมูลแผนบังคับใช้เมื่อมีการล้มเหลวของฐานข้อมูลจากแบบจำลองหลักเป็นแบบจำลองรองหรือไม่
คำตอบ: ใช่ QDS เก็บข้อมูลแผนบังคับในตาราง sys.query_store_plan ดังนั้นในกรณีที่เกิดความล้มเหลวคุณจะยังคงเห็นพฤติกรรมเดิมบน Primary ใหม่
แต่พฤติกรรมการบังคับใช้เกิดขึ้นจริงหรือไม่ ตอนนี้ฉันจะเรียกใช้แบบสอบถามเดียวกันในเซิร์ฟเวอร์ทั้งสอง บนหลักตามที่คาดไว้แอตทริบิวต์ "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">