Я веду журнал дорогостоящих выполняемых запросов вместе с их планами запросов в таблице, которая позволяет нам отслеживать тенденции в производительности и выявлять области, требующие оптимизации.
Однако дошло до того, что планы запросов занимают слишком много места (поскольку мы храним весь план для каждого запроса).
Поэтому я пытаюсь нормализовать существующие данные, извлекая QueryPlanHash и QueryPlan в другую таблицу.
CREATE TABLE QueryPlans
(
QueryPlanHash VARBINARY(25),
QueryPlan XML,
CONSTRAINT PK_QueryPlans PRIMARY KEY
(
QueryPlanHash
)
);
Поскольку определение query_plan_hash
in sys.dm_exec_query_stats
является двоичным полем (и я буду регулярно вставлять новые данные), я использовал VARBINARY
для типа данных в моей новой таблице.
Тем не менее, вставка ниже не удается ...
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
.... с ошибкой
Implicit conversion from data type varchar to varbinary is not allowed. Use the CONVERT function to run this query.
Проблема заключается в том, что хэши плана запросов уже находятся в двоичном формате, однако сохраняются как VARCHAR в плане запросов XML, например
0x9473FBCCBC01AFE
и CONVERT to BINARY дает совершенно другое значение
0x3078393437334642434342433031414645
Я попытался изменить определение значения в XQuery select на двоичное, но потом не вернуло никаких значений.
Как извлечь значение из 0x9473FBCCBC01AFE
плана XML-запроса как VARBINARY
, а не как VARCHAR
?
,1
то, чего мне не хватало. Это было проще, чем я ожидал! Благодарность!