Ho tenuto un registro delle query costose in esecuzione, insieme ai loro piani di query, in una tabella per consentirci di monitorare le tendenze nelle prestazioni e identificare le aree che devono essere ottimizzate.
Tuttavia, è arrivato al punto in cui i piani di query occupano troppo spazio (poiché stiamo memorizzando l'intero piano su ogni query).
Sto quindi tentando di normalizzare i dati esistenti estraendo QueryPlanHash e QueryPlan in un'altra tabella.
CREATE TABLE QueryPlans
(
QueryPlanHash VARBINARY(25),
QueryPlan XML,
CONSTRAINT PK_QueryPlans PRIMARY KEY
(
QueryPlanHash
)
);
Poiché la definizione di query_plan_hash
in sys.dm_exec_query_stats
è un campo binario (e inserirò regolarmente nuovi dati), stavo usando VARBINARY
per il tipo di dati nella mia nuova tabella.
Tuttavia, l'inserto seguente non riesce ...
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 l'errore
Implicit conversion from data type varchar to varbinary is not allowed. Use the CONVERT function to run this query.
Il problema è che gli hash del piano di query sono già in formato binario, tuttavia memorizzati come VARCHAR nel piano di query XML, ad es.
0x9473FBCCBC01AFE
e CONVERT a BINARY dà un valore completamente diverso
0x3078393437334642434342433031414645
Ho provato a cambiare la definizione del valore in XQuery selezionare su binario, ma poi non ha restituito alcun valore.
Come estrarrei il valore di 0x9473FBCCBC01AFE
un piano di query XML come un VARBINARY
, piuttosto che un VARCHAR
?
,1
era quello che mi mancava. È stato più facile di quanto mi aspettassi! Grazie!