บังคับให้ใช้แผนที่สำหรับบุคคลที่สองที่อ่านได้


14

หากมีการบังคับใช้แผนหลักในกลุ่มความพร้อมใช้งานจะมีการนำไปใช้กับคิวรีที่เรียกใช้บนรองหรือไม่?

ฉันกำลังมองหาคำตอบที่ครอบคลุมความเป็นไปได้ทั้งในการวางแผนบังคับ:

ฉันได้อ่านสิ่งต่อไปนี้ที่แนะนำแผนการบังคับใช้ QS ไม่ได้ดำเนินการ แต่ไม่พบสิ่งใดที่เชื่อถือได้ในเอกสารประกอบ

หลักฐานการบังคับจะมีการปรากฏตัวของUse PlanหรือPlanGuideNameและPlanGuideDBคุณสมบัติในการวางแผนการดำเนินการรอง

คำตอบ:


18

การบังคับใช้แผนร้านค้า Query จะไม่ส่งผลต่อข้อความค้นหาในรอง

การใช้ Query Store เพื่อบังคับแผนในหลักดูเหมือนว่าจะบังคับแผนในรอง

ฉันพยายามเรียกใช้แบบสอบถามบนเซิร์ฟเวอร์ที่ไม่ได้ผลิตแล้วล้างเก็บแบบสอบถามด้วยsp_query_store_flush_db(ซึ่งจำเป็นต้องได้รับข้อมูลเพื่อซิงค์ข้ามไปยังรอง) นี่คือลำดับที่สองทางด้านซ้าย (โปรดสังเกตคำเตือนที่เป็นวงกลมเกี่ยวกับการเป็น "อ่านอย่างเดียว") และข้อความทางด้านขวา

สกรีนช็อตของ UI ร้านค้าแบบสอบถาม

ตอนนี้ฉันจะคลิก "บังคับแผน" ทางด้านขวาแล้วรีเฟรชมุมมองทั้งสอง:

สกรีนช็อตของ UI ร้านค้าแบบสอบถามแสดงทั้งแผนบังคับ

ดังนั้น "บังคับ" ดำเนินการอย่างน้อยในตารางร้านค้าแบบสอบถามพื้นฐาน สิ่งนี้สมเหตุสมผลเนื่องจากบทความที่ยกมาใน 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:

สกรีนช็อตของแผนปฏิบัติการใน SSMS แสดงแอตทริบิวต์ "แผนการใช้"

บนรอง (ทราบชื่อเซิร์ฟเวอร์ที่แตกต่างกัน) แผนไม่ได้ถูกบังคับ ต่อไปนี้เป็นตัวอย่าง XML แผนเดียวกัน:

<QueryPlan DegreeOfParallelism="1" MemoryGrant="11096" CachedPlanSize="288" CompileTime="32" 
           CompileCPU="28" CompileMemory="1656">

สกรีนช็อตของแผนการดำเนินการใน SSMS แสดงแอตทริบิวต์ "แผนการใช้" ที่ไม่มี

คำแนะนำการวางแผนจะไม่ส่งผลกระทบต่อแบบสอบถามในรอง

ฉันสร้างคำแนะนำแผนหลักโดยใช้รหัสนี้ (เปลี่ยนชื่อตารางเพื่อปกป้องผู้บริสุทธิ์):

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" ...>

สกรีนช็อตของแผนการดำเนินการใน SSMS แสดงแอตทริบิวต์ของคำแนะนำแผน

ฉันยืนยัน ณ จุดนี้ว่าคู่มือแผนถูกจำลองแบบไปที่รอง

การเรียกใช้คิวรีเดียวกันในแผนสำรองแผนเรียกใช้ไม่มีสัญญาณทั้งหมดของการบังคับโดยคู่มือแผน:

<StmtSimple StatementCompId="1" StatementEstRows="1000" ... StatementType="SELECT" 
            QueryHash="0xECF8A24F126EE77A" QueryPlanHash="0x0E93CF7FEAC1B6EA" 
            RetrievedFromCache="true" SecurityPolicyApplied="false">

สกรีนช็อตของแผนการดำเนินการใน XML โดยไม่มีแอตทริบิวต์คำแนะนำแผน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.