Eu tenho mantido um registro de consultas em execução caras, juntamente com seus planos de consulta, em uma tabela para nos permitir monitorar tendências de desempenho e identificar áreas que precisam ser otimizadas.
No entanto, chegou ao ponto em que os planos de consulta estão ocupando muito espaço (pois estamos armazenando o plano inteiro em cada consulta).
Portanto, estou tentando normalizar os dados existentes extraindo o QueryPlanHash e QueryPlan para outra tabela.
CREATE TABLE QueryPlans
(
QueryPlanHash VARBINARY(25),
QueryPlan XML,
CONSTRAINT PK_QueryPlans PRIMARY KEY
(
QueryPlanHash
)
);
Como a definição do query_plan_hash
in sys.dm_exec_query_stats
é um campo binário (e eu regularmente inserirei novos dados), eu estava usando VARBINARY
o tipo de dados em minha nova tabela.
No entanto, a inserção abaixo falha ...
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
.... com o erro
Implicit conversion from data type varchar to varbinary is not allowed. Use the CONVERT function to run this query.
O problema é que os hashes do plano de consulta já estão em formato binário, no entanto, armazenados como VARCHAR no plano de consulta XML, por exemplo
0x9473FBCCBC01AFE
e CONVERT para BINARY fornece um valor completamente diferente
0x3078393437334642434342433031414645
Tentei alterar a definição de valor no XQuery select para binário, mas ele não retornou valores.
Como extrair o valor de 0x9473FBCCBC01AFE
um plano de consulta XML como um VARBINARY
, e não como VARCHAR
?
,1
era o que eu estava perdendo. Isso foi mais fácil do que eu esperava! Obrigado!