都内で働くSEの技術的なひとりごと / Technical soliloquy of System Engineer working in Tokyo

都内でサラリーマンやってます。SQL Server を中心とした (2023年からは Azure も。) マイクロソフト系(たまに、OSS系などマイクロソフト以外の技術も...)の技術的なことについて書いています。日々の仕事の中で、気になったことを技術要素関係なく気まぐれに選んでいるので記事内容は開発言語、インフラ等ばらばらです。なお、当ブログで発信、発言は私個人のものであり、所属する組織、企業、団体等とは何のかかわりもございません。ブログの内容もきちんと検証して使用してください。英語の勉強のため、英語の

SQL Server のチューニングについてまとめてみる - その7 - ( プランキャッシュの状態を確認する )

 実行プランのキャッシュ状態、パフォーマンスをチェックするクエリです。オブジェクトの種類が Adhoc か Prepared なのかとか、その他色々気になりますよね?

SELECT [SQL文] = SUBSTRING(st.text, (qs.statement_start_offset/2)+1, 
((CASE qs.statement_end_offset
WHEN -1 THEN
DATALENGTH(st.text)
ELSE
qs.statement_end_offset
END -
qs.statement_start_offset)/2
) + 1),
[PlanCacheが検索された回数] = cp.usecounts,
[CacheSize(byte)] = cp.size_in_bytes,
[オブジェクトの種類] = cp.objtype,
[キャッシュ内のオブジェクトの種類] = cp.cacheobjtype,
[プランハンドル] = cp.plan_handle,
[プランがコンパイルされた時間] = qs.creation_time,
[総CPU時間(msec)] = qs.total_worker_time,
[平均CPU時間(msec)] = qs.total_worker_time/qs.execution_count,
[総物理読込回数] = qs.total_physical_reads,
[平均物理読込回数] = qs.total_physical_reads/qs.execution_count,
[総論理読込回数] = qs.total_logical_reads,
[平均論理読込回数] = qs.total_logical_reads/qs.execution_count,
[総論理書込回数] = qs.total_logical_writes,
[平均論理書込回数] = qs.total_logical_writes/qs.execution_count,
[総実行時間(msec)] = qs.total_elapsed_time,
[平均実行時間(msec)] = qs.total_elapsed_time/qs.execution_count,
[最少行数] = qs.min_rows,
[最大行数] = qs.max_rows,
[総行数] = qs.total_rows,
[平均行数] = qs.total_rows/qs.execution_count,
[クエリハッシュ] = qs.query_hash,
[クエリプランハッシュ] = qs.query_plan_hash
FROM sys.dm_exec_cached_plans cp
INNER JOIN sys.dm_exec_query_stats qs
ON cp.plan_handle = qs.plan_handle
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
CROSS APPLY sys.dm_exec_sql_text(qs.plan_handle) st

f:id:koogucc11:20140907231804p:plain

 色々チェックできるクエリを作っていきましょう。色々な動的管理ビュー、動的管理関数を組み合わせることで、様々な角度から自身のクエリをチェックすることができます。