我在表格中记录了昂贵的运行查询及其查询计划,以便我们监控性能趋势并确定需要优化的区域.
但是,它已经到了查询计划占用太多空间的程度(因为我们正在针对每个查询存储整个计划).
因此,我试图通过将QueryPlanHash和QueryPlan提取到另一个表来规范化现有数据.
CREATE TABLE QueryPlans ( QueryPlanHash VARBINARY(25),QueryPlan XML,CONSTRAINT PK_QueryPlans PRIMARY KEY ( QueryPlanHash ) );
由于sys.dm_exec_query_stats中query_plan_hash的定义是二进制字段(我经常插入新数据),我在新表中使用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.
问题是查询计划哈希值已经是二进制格式,但是在XML查询计划中存储为VARCHAR,例如
0x9473FBCCBC01AFE
和CONVERT到BINARY给出了完全不同的值
0x3078393437334642434342433031414645
我尝试将XQuery select中的值定义更改为二进制,但之后它没有返回任何值.