web-dev-qa-db-ja.com

クエリプランを解析して、順不同のプリフェッチでネストされたループ演算子の数を取得する方法は?

上司は、テーブルに格納されているクエリプランのセットを解析し、各プランに 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式から省略します。

9
Erik Darling