เอกสารประกอบนั้นทำให้เข้าใจผิดเล็กน้อย DMV เป็นมุมมองที่ไม่ปรากฏขึ้นและไม่มีคีย์หลักเช่นนี้ คำจำกัดความพื้นฐานมีความซับซ้อนเล็กน้อย แต่คำจำกัดความง่าย ๆ ของsys.query_store_plan
คือ:
CREATE VIEW sys.query_store_plan AS
SELECT
PPM.plan_id
-- various other attributes
FROM sys.plan_persist_plan_merged AS PPM
LEFT JOIN sys.syspalvalues AS P
ON P.class = 'PFT'
AND P.[value] = plan_forcing_type;
นอกจากsys.plan_persist_plan_merged
นี้ยังเป็นมุมมองแม้ว่าจะต้องเชื่อมต่อผ่านการเชื่อมต่อผู้ดูแลระบบเฉพาะเพื่อดูคำจำกัดความของมัน เรียบง่ายอีกครั้ง:
CREATE VIEW sys.plan_persist_plan_merged AS
SELECT
P.plan_id as plan_id,
-- various other attributes
FROM sys.plan_persist_plan P
-- NOTE - in order to prevent potential deadlock
-- between QDS_STATEMENT_STABILITY LOCK and index locks
WITH (NOLOCK)
LEFT JOIN sys.plan_persist_plan_in_memory PM
ON P.plan_id = PM.plan_id;
ดัชนีบนsys.plan_persist_plan
คือ:
╔════════════════════════╦════════════════════════ ══════════════╦═════════════╗
║ index_name ║ index_description ║ index_keys ║
╠════════════════════════╬════════════════════════ ══════════════╬═════════════╣
║ plan_persist_plan_cidx ║ทำคลัสเตอร์แบบไม่ซ้ำใครตั้งอยู่บน primary ║ plan_id ║
║ plan_persist_plan_idx1 ║ nonclustered ตั้งอยู่ใน primary ║ query_id (-) ║
╚════════════════════════╩════════════════════════ ══════════════╩═════════════╝
ดังนั้นplan_id
เป็นข้อ จำกัด sys.plan_persist_plan
ที่จะไม่ซ้ำกันใน
ตอนนี้sys.plan_persist_plan_in_memory
เป็นฟังก์ชั่นค่าตารางสตรีมมิ่งนำเสนอมุมมองแบบตารางของข้อมูลที่จัดขึ้นเฉพาะในโครงสร้างหน่วยความจำภายใน ดังนั้นจึงไม่มีข้อ จำกัด ที่เป็นเอกลักษณ์
ที่สำคัญเคียวรีที่กำลังดำเนินการจึงเท่ากับ:
DECLARE @t1 table (plan_id integer NOT NULL);
DECLARE @t2 table (plan_id integer NOT NULL UNIQUE CLUSTERED);
DECLARE @t3 table (plan_id integer NULL);
SELECT
T1.plan_id
FROM @t1 AS T1
LEFT JOIN
(
SELECT
T2.plan_id
FROM @t2 AS T2
LEFT JOIN @t3 AS T3
ON T3.plan_id = T2.plan_id
) AS Q1
ON Q1.plan_id = T1.plan_id;
... ที่ไม่ได้เข้าร่วมการกำจัด:
การเข้าถึงประเด็นหลักของปัญหาปัญหาคือแบบสอบถามภายใน:
DECLARE @t2 table (plan_id integer NOT NULL UNIQUE CLUSTERED);
DECLARE @t3 table (plan_id integer NULL);
SELECT
T2.plan_id
FROM @t2 AS T2
LEFT JOIN @t3 AS T3
ON T3.plan_id = T2.plan_id;
... ชัดเจนการเข้าร่วมด้านซ้ายอาจส่งผลให้แถว@t2
ถูกทำซ้ำเนื่องจาก@t3
ไม่มีข้อ จำกัด ที่ไม่ซ้ำplan_id
กัน ดังนั้นการเข้าร่วมไม่สามารถถูกยกเลิกได้:
เพื่อแก้ไขปัญหานี้เราสามารถบอกเครื่องมือเพิ่มประสิทธิภาพได้อย่างชัดเจนว่าเราไม่ต้องการplan_id
ค่าที่ซ้ำกัน:
DECLARE @t2 table (plan_id integer NOT NULL UNIQUE CLUSTERED);
DECLARE @t3 table (plan_id integer NULL);
SELECT DISTINCT
T2.plan_id
FROM @t2 AS T2
LEFT JOIN @t3 AS T3
ON T3.plan_id = T2.plan_id;
การรวมภายนอกเพื่อ@t3
สามารถยกเลิกได้:
นำไปใช้กับแบบสอบถามจริง:
SELECT DISTINCT
T.plan_id
FROM #tears AS T
LEFT JOIN sys.query_store_plan AS QSP
ON QSP.plan_id = T.plan_id;
อย่างเท่าเทียมกันเราสามารถเพิ่มแทนGROUP BY T.plan_id
DISTINCT
อย่างไรก็ตามเครื่องมือเพิ่มประสิทธิภาพสามารถให้เหตุผลอย่างถูกต้องเกี่ยวกับplan_id
คุณลักษณะจนถึงมุมมองแบบซ้อนและกำจัดการรวมภายนอกทั้งสองตามที่ต้องการ:
โปรดทราบว่าการสร้างความplan_id
พิเศษในตารางชั่วคราวจะไม่เพียงพอที่จะได้รับการเข้าร่วมการกำจัดเนื่องจากมันจะไม่ขัดขวางผลลัพธ์ที่ไม่ถูกต้อง เราต้องปฏิเสธplan_id
ค่าที่ซ้ำกันอย่างชัดเจนจากผลลัพธ์สุดท้ายเพื่อให้เครื่องมือเพิ่มประสิทธิภาพทำงานได้ที่นี่