私の同僚は、XMLクエリを使用して実行計画を解析するの巧妙な考えを持っていた:
実行計画は、XMLとして保存し、その後のレベルの深さ/数を減らすために、ウェブサイト上で濾過する必要があり、あってはならないより大きく128:
http://xmltoolbox.appspot.com/
1. Paste the XML
2. Add Column Reference as a filter
3. Format xml
4. Save it again as flatfile
濾過XML読み取りおよびSQLで処理することができる。
DECLARE @xml xml = (
SELECT CAST(BulkColumn AS XML) FROM OPENROWSET(
BULK 'c:\temp\Herkunftsselect_filtered.xml',
SINGLE_BLOB) AS ExecPlan
);
WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS SP)
SELECT DISTINCT
'Database' = n.xml.value('./@Database','nvarchar(100)'),
'Schema' = n.xml.value('./@Schema','nvarchar(100)'),
'Tabelle' = n.xml.value('./@Table','nvarchar(100)'),
'Alias' = n.xml.value('./@Alias','nvarchar(100)'),
'Column' = n.xml.value('./@Column','nvarchar(100)')
FROM @xml.nodes('/Root/SP:ColumnReference') n(xml)
WHERE n.xml.value('./@Column','nvarchar(100)') NOT LIKE 'Expr%'
AND n.xml.value('./@Column','nvarchar(100)') NOT LIKE 'Chk%'
AND n.xml.value('./@Column','nvarchar(100)') NOT LIKE 'Bitmap%'
AND n.xml.value('./@Column','nvarchar(100)') NOT LIKE 'IsBaseRow%'
AND n.xml.value('./@Column','nvarchar(100)') NOT LIKE 'Union%'
AND n.xml.value('./@Column','nvarchar(100)') NOT LIKE 'Segment%'
ORDER BY 1,2,3,4,5
ここで欠けている部分は、スクリプトファイルをループして実行計画を生成し、XMLをフィルタリングしてクエリを実行するプロセスを完全に自動化する方法だけです。私の同僚が考えた方法は、すべてのスクリプトファイルを1つの大きなファイル(ファイルをループして追加する)にマージして手動のプロセスを1回だけ実行する必要があるということです。
手順は少なくともテーブルを取得するには悪くないが、列は別の話です。 sys.sysdependsを使用しても、オブジェクトが取得されます。これらのオブジェクトはテーブルでも構いませんが、関数、ビューなどであっても分析する必要があります。そして、アドホックなクエリになると、それを手動で解析することが正確に不足することはほとんど不可能になります。 –
RedGate SQL Searchには、列名がストアドプロシージャで参照されている場所を見つけることができる影響分析機能があります。あなたのアドホックなクエリに役立つかどうかは分かりません。 http://www.red-gate.com/products/sql-development/sql-search/ – mallan1121