ฉันได้เก็บบันทึกข้อความค้นหาที่ใช้งานราคาแพงพร้อมกับแผนแบบสอบถามไว้ในตารางเพื่อให้เราสามารถตรวจสอบแนวโน้มด้านประสิทธิภาพและระบุพื้นที่ที่ต้องการเพิ่มประสิทธิภาพ
อย่างไรก็ตามมาถึงจุดที่แผนการสืบค้นใช้พื้นที่มากเกินไป (เนื่องจากเราจัดเก็บทั้งแผนกับแต่ละแบบสอบถาม)
ฉันจึงพยายามทำให้ข้อมูลที่มีอยู่เป็นปกติด้วยการแยก QueryPlanHash และ QueryPlan ไปยังตารางอื่น
CREATE TABLE QueryPlans
(
    QueryPlanHash VARBINARY(25),
    QueryPlan XML,
    CONSTRAINT PK_QueryPlans PRIMARY KEY
    (
      QueryPlanHash
    )
);เนื่องจากคำจำกัดความของquery_plan_hashin 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เป็นสิ่งที่ฉันขาดหายไป นั่นง่ายกว่าที่ฉันคาดไว้! ขอบคุณ!