ちょっとしたメモですが特定の操作を含むクエリ情報の取得のパターンをいくつか。
それっぽい情報は取れていると思いますが、XML の操作あまりわかっていません…。
そのうち 修羅イバーさんか 修羅イバーブログ で取り上げてくれると信じています。
XML の操作については Basic SQL Server XML Querying / Manipulating XML Data in SQL Server が参考になりました。
■Clusterd Index Scan が含まれるクエリの取得
Clusterd Index Scan はテーブルの全件スキャンとなり、データ件数が多い場合はコストが高い可能性があるので、チューニング対象となるケースが多いです。
WITH XMLNAMESPACES
('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS ns)
SELECT
text
, query_plan
, creation_time
, min_elapsed_time
, max_elapsed_time
, min_logical_reads
, max_logical_reads
, min_logical_writes
, max_logical_writes
FROM
sys.dm_exec_query_stats
CROSS APPLY sys.dm_exec_query_plan(plan_handle)
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
WHERE
query_plan.exist('//ns:RelOp[@PhysicalOp=''Clustered Index Scan'']') = 1
■暗黙の方変換が実行されているクエリの取得
暗黙の方変換が行われた場合、データの件数が多いとオーバーヘッドになることがありますので。
WITH XMLNAMESPACES
('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS ns)
SELECT
text
, query_plan
, creation_time
, min_elapsed_time
, max_elapsed_time
, min_logical_reads
, max_logical_reads
, min_logical_writes
, max_logical_writes
FROM
sys.dm_exec_query_stats
CROSS APPLY sys.dm_exec_query_plan(plan_handle)
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
WHERE
query_plan.exist('//ns:ScalarOperator[contains(@ScalarString, ''CONVERT_IMPLICIT'')]') = 1
■Nested Loop Join が含まれるクエリの取得
JOIN が Nested Loop で行われているクエリの取得です。
オプティマイザが選択した JOIN 方法を使用することが一般的ですが、JOIN 句のチューニングが必要かどうかの判断に使えるのかなと。
WITH XMLNAMESPACES
('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS ns)
SELECT
text
, query_plan
, creation_time
, min_elapsed_time
, max_elapsed_time
, min_logical_reads
, max_logical_reads
, min_logical_writes
, max_logical_writes
FROM
sys.dm_exec_query_stats
CROSS APPLY sys.dm_exec_query_plan(plan_handle)
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
WHERE
query_plan.exist('//ns:RelOp[@PhysicalOp=''Nested Loops'']') = 1
[…] 特定の操作を含むクエリ情報を取得 | SE の雑記 […]
特定の操作を含むクエリ情報を取得 | SE の雑記 | xml話題ポータル.com
2 9月 14 at 18:47