上司は、テーブルに格納されているクエリプランのセットを解析し、各プランに nordered prefetching を含むネストされたループ演算子がいくつあるかを確認することを望んでいます。私は約100のクエリプランしかないので、パフォーマンスはそれほど重要ではありません。自分でやってみましたが、すぐに戸惑い、上手くいきませんでした。
テーブルの構造:
DROP TABLE IF EXISTS dbo.query_plans;
CREATE TABLE dbo.query_plans (
plan_name VARCHAR(100),
query_xml XML
);
T-SQLをアップロードして、3つのクエリプランの例を Pastebin のテーブルに追加しました。これは私が探している出力です:
╔═════════════╦════════════════╗
║ plan_name ║ OPERATOR_COUNT ║
╠═════════════╬════════════════╣
║ NO_PREFETCH ║ 0 ║
║ 1_PREFETCH ║ 1 ║
║ 2_PREFETCH ║ 2 ║
╚═════════════╩════════════════╝
なぜこれを行う必要があるのか、質問には答えられません。ありがとう!
これは完全に機能します®
WITH XMLNAMESPACES ( 'http://schemas.Microsoft.com/sqlserver/2004/07/showplan' AS p )
SELECT qp.plan_name,
qp.query_xml.value('count(//p:RelOp/p:NestedLoops/@WithUnorderedPrefetch)', 'int') AS operator_count
FROM dbo.query_plans AS qp;
必要に応じて、
WITH XMLNAMESPACES (DEFAULT 'http://schemas.Microsoft.com/sqlserver/2004/07/showplan')
...名前空間接頭辞p:
をXQuery式から省略します。