Я зберігаю журнал дорогих запущених запитів разом з їх планами запитів у таблиці, щоб ми могли відстежувати тенденції в продуктивності та визначати області, які потребують оптимізації.
Однак дійшло до того, що плани запитів займають занадто багато місця (оскільки ми зберігаємо весь план проти кожного запиту).
Тому я намагаюся нормалізувати наявні дані, витягнувши 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 як a VARBINARY
, а не як VARCHAR
?
,1
було те, чого мені не вистачало. Це було простіше, ніж я очікував! Спасибі!