我一直将昂贵的运行查询及其查询计划记录在一个表中,以使我们能够监视性能趋势并确定需要优化的领域。
但是,到了查询计划占用太多空间的地步(因为我们针对每个查询存储整个计划)。
因此,我试图通过将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查询计划中,例如
0x9473FBCCBC01AFE
和CONVERT to BINARY给出了完全不同的值
0x3078393437334642434342433031414645
我尝试将XQuery选择中的值定义更改为二进制,但随后未返回任何值。
如何0x9473FBCCBC01AFE
从XML查询计划中提取的值作为VARBINARY
,而不是VARCHAR
?
,1
是我所缺少的。这比我预期的要容易!谢谢!