都内で働くSEの技術的なひとりごと

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

出張先から帰ってきたので、待機監視用のクエリを書いてみる

 出張先から帰ってきて、仕事の合間にクエリ書いてみます。待機監視するクエリを書いてみます。待機をチェックするには、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

f:id:koogucc11:20150429142944p:plain
 
 今回は、ブロックが発生するようにクエリをしかけています。下図は、あるテーブルに対してトランザクションを開始して、INSERT 文を発行した状態です。COMMIT は実行していません。
f:id:koogucc11:20150429143257p:plain

 上図で INSERT を行っているテーブルに対して SELECT を実行しています。(SPID = 59)このクエリがブロックされている側です。
f:id:koogucc11:20150429143339p:plain

 COMMIT を実行すると、ブロッキングは解消され、待機監視用クエリを実行すると下図のようになります。
f:id:koogucc11:20150429144215p:plain

 このクエリを実行して、大量の結果が表示され、目をゴシゴシするくらいの待機時間(ms)が表示されないことをお祈りします。さぁ、仕事しよう....

SSIS も覚えないとね。

Scripting SSIS with .NET: A Toolkit for SQL Server Integration Services

Scripting SSIS with .NET: A Toolkit for SQL Server Integration Services