ฉันได้เก็บบันทึกข้อความค้นหาที่ใช้งานราคาแพงพร้อมกับแผนแบบสอบถามไว้ในตารางเพื่อให้เราสามารถตรวจสอบแนวโน้มด้านประสิทธิภาพและระบุพื้นที่ที่ต้องการเพิ่มประสิทธิภาพ
อย่างไรก็ตามมาถึงจุดที่แผนการสืบค้นใช้พื้นที่มากเกินไป (เนื่องจากเราจัดเก็บทั้งแผนกับแต่ละแบบสอบถาม)
ฉันจึงพยายามทำให้ข้อมูลที่มีอยู่เป็นปกติด้วยการแยก QueryPlanHash และ QueryPlan ไปยังตารางอื่น
CREATE TABLE QueryPlans
(
QueryPlanHash VARBINARY(25),
QueryPlan XML,
CONSTRAINT PK_QueryPlans PRIMARY KEY
(
QueryPlanHash
)
);
เนื่องจากคำจำกัดความของquery_plan_hash
in sys.dm_exec_query_stats
เป็นเขตข้อมูลไบนารี (และฉันจะแทรกข้อมูลใหม่เป็นประจำ) ฉันจึงใช้VARBINARY
กับชนิดข้อมูลในตารางใหม่ของฉัน
อย่างไรก็ตามการแทรกด้านล่างล้มเหลว ...
INSERT INTO QueryPlans
( QueryPlanHash, QueryPlan )
SELECT queryplanhash, queryplan
FROM
(
SELECT
p.value('(./@QueryPlanHash)[1]', 'varchar(20)') queryplanhash,
QueryPlan,
ROW_NUMBER() OVER (PARTITION BY p.value('(./@QueryPlanHash)[1]', 'varchar(20)') ORDER BY DateRecorded) rownum
FROM table
CROSS APPLY QueryPlan.nodes('/ShowPlanXML/BatchSequence/Batch/Statements/StmtSimple[@QueryPlanHash]') t(p)
) data
WHERE rownum = 1
.... ด้วยข้อผิดพลาด
Implicit conversion from data type varchar to varbinary is not allowed. Use the CONVERT function to run this query.
ปัญหาคือแฮชแผนแบบสอบถามมีอยู่แล้วในรูปแบบไบนารีอย่างไรก็ตามเก็บไว้เป็น VARCHAR ใน XML Query Plan เช่น
0x9473FBCCBC01AFE
และแปลงเป็นไบนารีให้ค่าที่ต่างกันโดยสิ้นเชิง
0x3078393437334642434342433031414645
ฉันพยายามเปลี่ยนนิยามของค่าใน XQuery select เป็น binary แต่แล้วมันก็คืนค่าใด ๆ
ฉันจะแยกค่า0x9473FBCCBC01AFE
จากแผนแบบสอบถาม XML เป็น a VARBINARY
แทนที่จะเป็นVARCHAR
อย่างไร
,1
เป็นสิ่งที่ฉันขาดหายไป นั่นง่ายกว่าที่ฉันคาดไว้! ขอบคุณ!