Prowadzę dziennik drogich uruchomionych zapytań wraz z ich planami zapytań w tabeli, abyśmy mogli monitorować trendy w wydajności i identyfikować obszary wymagające optymalizacji.
Doszło jednak do tego, że plany zapytań zajmują zbyt dużo miejsca (ponieważ przechowujemy cały plan dla każdego zapytania).
Dlatego próbuję znormalizować istniejące dane, wyodrębniając QueryPlanHash i QueryPlan do innej tabeli.
CREATE TABLE QueryPlans
(
QueryPlanHash VARBINARY(25),
QueryPlan XML,
CONSTRAINT PK_QueryPlans PRIMARY KEY
(
QueryPlanHash
)
);
Ponieważ definicja query_plan_hash
in sys.dm_exec_query_stats
jest polem binarnym (i będę regularnie wstawiał nowe dane), użyłem VARBINARY
dla typu danych w mojej nowej tabeli.
Poniższa wstawka nie działa jednak ...
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
.... z błędem
Implicit conversion from data type varchar to varbinary is not allowed. Use the CONVERT function to run this query.
Problem polega na tym, że skróty planu zapytań są już w formacie binarnym, jednak są przechowywane jako VARCHAR w planie zapytań XML, np.
0x9473FBCCBC01AFE
a CONVERT to BINARY daje zupełnie inną wartość
0x3078393437334642434342433031414645
Próbowałem zmienić definicję wartości w XQuery select na binarną, ale potem nie zwróciło żadnych wartości.
Jak wyodrębnić wartość 0x9473FBCCBC01AFE
z planu zapytań XML jako VARBINARY
zamiast, a nie VARCHAR
?
,1
tego mi brakowało. To było łatwiejsze niż się spodziewałem! Dzięki!