He mantenido un registro de consultas costosas en ejecución, junto con sus planes de consulta, en una tabla que nos permite monitorear las tendencias en el rendimiento e identificar áreas que necesitan optimización.
Sin embargo, ha llegado al punto en que los planes de consulta ocupan demasiado espacio (ya que estamos almacenando el plan completo en cada consulta).
Por lo tanto, intento normalizar los datos existentes extrayendo QueryPlanHash y QueryPlan a otra tabla.
CREATE TABLE QueryPlans
(
QueryPlanHash VARBINARY(25),
QueryPlan XML,
CONSTRAINT PK_QueryPlans PRIMARY KEY
(
QueryPlanHash
)
);
Como la definición de query_plan_hash
in sys.dm_exec_query_stats
es un campo binario (y regularmente insertaré nuevos datos), estaba usando VARBINARY
el tipo de datos en mi nueva tabla.
Sin embargo, el siguiente inserto falla ...
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
.... con el error
Implicit conversion from data type varchar to varbinary is not allowed. Use the CONVERT function to run this query.
El problema es que los hashes del plan de consulta ya están en formato binario, pero se almacenan como VARCHAR en el Plan de consulta XML, por ejemplo
0x9473FBCCBC01AFE
y CONVERT a BINARY da un valor completamente diferente
0x3078393437334642434342433031414645
Intenté cambiar la definición del valor en XQuery select a binario, pero luego no devolvió valores.
¿Cómo extraería el valor de 0x9473FBCCBC01AFE
un plan de consulta XML como a VARBINARY
, en lugar de a VARCHAR
?
,1
eso era lo que me faltaba. ¡Eso fue más fácil de lo que esperaba! ¡Gracias!