出張先から帰ってきたので、待機監視用のクエリを書いてみる
出張先から帰ってきて、仕事の合間にクエリ書いてみます。待機監視するクエリを書いてみます。待機をチェックするには、sys.dm_os_waiting_tasks を使用します。同時に、クエリ内容、プラン、その他色々チェックしたいので、下記の動的管理ビュー、動的管理関数も使用します。
下記のクエリを SQL Server Management Studio で実行してみましょう。(ちょっとクエリの書き方、変えてみました。)
SELECT [セッションID] = owt.session_id, [実行コンテキストID] = owt.exec_context_id, [待機時間(ms)] = owt.wait_duration_ms, [待機の種類] = owt.wait_type, [ブロックしているセッションID] = owt.blocking_session_id, [ブロックしている実行コンテキストID] = owt.blocking_exec_context_id, [使用されているリソース詳細] = owt.resource_description, [CPU時間] = er.cpu_time, [コマンド] = er.command, [実行開始時間] = er.start_time, [実行プログラム名] = es.program_name, [SQLハンドル] = er.sql_handle, [実行クエリ] = st.text, [プランハンドル] = er.plan_handle, [実行クエリプラン] = qp.query_plan FROM sys.dm_os_waiting_tasks owt INNER JOIN sys.dm_exec_sessions es ON owt.session_id = es.session_id INNER JOIN sys.dm_exec_requests er ON es.session_id = er.session_id CROSS APPLY sys.dm_exec_sql_text(er.sql_handle) st CROSS APPLY sys.dm_exec_query_plan(er.plan_handle) qp WHERE es.is_user_process = 1 ORDER BY owt.session_id
今回は、ブロックが発生するようにクエリをしかけています。下図は、あるテーブルに対してトランザクションを開始して、INSERT 文を発行した状態です。COMMIT は実行していません。
上図で INSERT を行っているテーブルに対して SELECT を実行しています。(SPID = 59)このクエリがブロックされている側です。
COMMIT を実行すると、ブロッキングは解消され、待機監視用クエリを実行すると下図のようになります。
このクエリを実行して、大量の結果が表示され、目をゴシゴシするくらいの待機時間(ms)が表示されないことをお祈りします。さぁ、仕事しよう....
※ SSIS も覚えないとね。
Scripting SSIS with .NET: A Toolkit for SQL Server Integration Services
- 作者: Joost van Rossum,Regis Baccaro
- 出版社/メーカー: Apress
- 発売日: 2015/11/22
- メディア: ペーパーバック
- この商品を含むブログを見る