SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

SQL Server 2012 RC0 の SSMS を使ってセッション単位の待ち事象を確認する

leave a comment

SQL Server 2012 RC0 の SSMS (SQL Server Management Studio) では、拡張イベントの使い勝手が大幅に向上しています。

今までのバージョンの SQL Server では、待ち事象 (Wait Event) は [sys.dm_os_wait_stats] で累計値を確認するのが一般的な方法であったかと思います。
この方法を使用した待ち事象の確認は対象インスタンスの累計値となりますので、処理を実行したときの特定のセッションの待ち事象をピックアップして確認するというのが難しい状況となっていました。
# 対象の処理のみが実行されている状態であれば、実行前 / 実行後の差をとることで近似値のデータは取れると思います。

SQL Server 2012 RC0 の SSMS の拡張イベントを使用すると、特定のセッションの待ち事象を取得するというのが簡単に実現することが可能です。
RC0 の SSMS のGUI から拡張イベントを操作できるのは SQL Server 2012 のインスタンスに接続した場合に限定されているので、SQL Server 2008 / R2 では SSMS からは操作できませんが、拡張イベントの機能は実装されていますので似たようなことはできるかもしれないですね。

■SSMS でセッション単位の待ち事象を確認してみる


それでは実際に試してみたいと思います。
先ほども書きましたが SQL Server 2012 RC0 の SSMS で拡張イベントの操作が GUI で可能なのは SQL Server 2012 のインスタンスに限定されています。
SQL Server 2008 R2 に接続した場合の状態がこちらになりますが、拡張イベントが表示されていない状態ですね。
image

基本的な仕組みは同じだと思いますので、SQL Server 2012 で設定した内容を基にすれば SQL Server 2008 / R2 でも流用できるかもしれないですね。
# リングバッファターゲットを使用したライブデータの表示はできないかなと思いますが。

それでは実際に作成してみたいと思います。

SQL Server 2012 では、管理の配下に [拡張イベント] の項目が追加されています。
セッションを右クリックすると [新規セッション ウィザード] が選択できますので、このウィザードを使用して、拡張イベントを作成します。

image

  1. [新規セッション ウィザード] をクリックします。
  2. [次へ] をクリックします。
    image
  3. [セッション名] を入力して、[次へ] をクリックします。
    image
  4. [テンプレートを使用しない] (デフォルト) を選択して、[次へ] をクリックします。
    image
  5. イベントとして [wait_info] を追加して、[次へ] をクリックします。
    image
  6. キャプチャするグローバルフィールド(どのイベントでも共通で選択することができる固有でないフィールド) を選択して、[次へ] をクリックします。
    今回は [session_id] と [sql_text] を追加しています。
    image
  7. イベントフィルタを追加して、[次へ] をクリックします。
    今回は SessionID (@@SPID) が [64] となっているクエリエディタを使用しますので、このセッションに限定するようにフィルタを設定しています。
    image
  8. [最新のデータのみを表示する] を有効にして、[次へ] をクリックします。
    image
  9. [完了] をクリックします。
    image
  10. 両方のチェックを有効にして、[閉じる] をクリックし拡張イベントによるトレースを開始します。
    image

以上で設定は完了です。
拡張イベントを使用したトレースが開始されます。
image

ウィザードでは設定ができなかったのですが、一度設定をした後に拡張イベントトを編集することで [duration] を [>0] に設定することで、待ち事象により待機が発生したイベントのみを取得ということもできます。
image

 

■セッション単位の待ち事象を確認する


それでは、実際にセッション単位の待ち事象を確認してみたいと思います。

まずは、[WAITFOR DELAY] を使用してみます。
image

これを実行すると二つの情報が取得できます。
image
image

WAITFOR DELAY を使用した場合、待ち事象としては WAITFOR になります。
その待ち事象の発生と、待ち事象によりどれだけ待機が発生したかが取得できています。
項目として SessionID と SQL のテキストも取得していますのでどのセッションでどのようなクエリを実行した際に待ちが発生したというのを確認することができますね。

また、以下のようなクエリを実行したとします。
image

[SET NOCOUNT OFF] を設定 (デフォルトの状態) していますので  INSERT を実行するたびに [1 行処理されました] というメッセージがクライアントに返されることになります。

この時の待ち事象を確認してみます。
# [duration > 0] のフィルタを設定しています。
image

[WRITELOG] のほかに、[NETWORK_IO] という待ち事象が発生していることが確認できます。

それではクエリを以下のように変更してみます。
image

[SET NOCOUNT ON] を設定していますので、クエリによって変更のあったデータ件数のメッセージがクライアントに返らなくなります。

待ち事象を確認するとこのような形になります。
image

クエリの変更により、[NETWORK_IO] の待ち事象がなくなっているのが確認できますね。

SQL Server 2012 の SSMS + SQL Server 2012 のインスタンス使用することでこのような変更に対しての待ち事象への影響を簡単に確認することができるようになります。

他にもイベントはたくさんありますので使いこなせると SQL Server で何が起こっているかを把握するための強力な一助となりそうですね。

Share

Written by Masayuki.Ozawa

12月 8th, 2011 at 8:19 am

Posted in SQL Server

Tagged with ,

Leave a Reply