パフォーマンスの傾向を監視し、最適化が必要な領域を特定できるように、実行中の高価なクエリのログとクエリプランをテーブルに保存しています。
ただし、クエリプランが多くのスペースを占有するようになります(各クエリに対してプラン全体を保存しているため)。
したがって、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.
問題は、クエリプランのハッシュが既にバイナリ形式であるが、XMLクエリプランにVARCHARとして格納されていることです。
0x9473FBCCBC01AFE
CONVERT to BINARYはまったく異なる値を与えます
0x3078393437334642434342433031414645
XQuery selectの値定義をバイナリに変更しようとしましたが、値が返されませんでした。
0x9473FBCCBC01AFE
XMLクエリプランからの値をa VARBINARY
ではなくaとして抽出するにはどうすればよいVARCHAR
ですか?
,1
私が行方不明でした。それは思っていたより簡単でした!ありがとう!