Ich habe ein Protokoll der teuren laufenden Abfragen zusammen mit ihren Abfrageplänen in einer Tabelle geführt, damit wir Leistungstrends überwachen und Bereiche identifizieren können, die optimiert werden müssen.
Es ist jedoch so weit, dass die Abfragepläne zu viel Speicherplatz beanspruchen (da der gesamte Plan für jede Abfrage gespeichert wird).
Ich versuche daher, die vorhandenen Daten zu normalisieren, indem ich QueryPlanHash und QueryPlan in eine andere Tabelle extrahiere.
CREATE TABLE QueryPlans
(
QueryPlanHash VARBINARY(25),
QueryPlan XML,
CONSTRAINT PK_QueryPlans PRIMARY KEY
(
QueryPlanHash
)
);
Da die Definition des query_plan_hash
in sys.dm_exec_query_stats
ein binäres Feld ist (und ich regelmäßig neue Daten eingefügt sein werden), war ich mit VARBINARY
für den Datentyp in meinem neuen Tisch.
Die folgende Einfügung schlägt jedoch fehl ...
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
.... mit dem Fehler
Implicit conversion from data type varchar to varbinary is not allowed. Use the CONVERT function to run this query.
Das Problem ist, dass die Abfrageplan-Hashes bereits im Binärformat vorliegen, jedoch als VARCHAR im XML-Abfrageplan gespeichert sind, z
0x9473FBCCBC01AFE
und CONVERT to BINARY ergibt einen völlig anderen Wert
0x3078393437334642434342433031414645
Ich habe versucht, die Wertedefinition in der XQuery-Auswahl in "Binär" zu ändern, aber dann wurden keine Werte zurückgegeben.
Wie würde ich den Wert von 0x9473FBCCBC01AFE
aus einem XML-Abfrageplan VARBINARY
eher als als extrahieren VARCHAR
?
,1
mir gefehlt. Das war einfacher als ich erwartet hatte! Vielen Dank!