Analysis Services のデッドロックとブロッキングの確認方法

はじめに

Analysis Services データベースにおいてもデッドロックやブロッキングが発生することがあり、SQL Server Profiler を使って発生状況を確認する事が可能です。

Profiler の起動方法についてはこちらをご覧下さい。
SQL Server も Analysis Services も Profiler の起動方法は同じです。
Profiler の接続先を Analysis Services インスタンスに指定することで、Analysis Services のトレースを取得できます。

※Profiler を GUI で使用すると、スクリプトで取得する場合と比較して負荷が大きくなります。そのため、運用環境で情報を取得する場合は、スクリプトで取得する事をお勧めします。スクリプトでの取得方法は、[SSAS] SQL Server Analysis Services トレース採取方法 をご覧ください。

-- 参考情報
DO's&DONT's #1: やらない方がいいこと   運用環境で、Profiler GUI を使用してトレースする

デッドロックの確認方法
Analysis Services のデッドロックは SQL Server Profiler の Deadlock イベントで確認することができます。
Deadlock イベントでは、デッドロックを検知した際に、XML の構造でその情報を取得します。どのセッションがどのオブジェクトに対してロックを獲得していて、どのセッションがそのオブジェクトへのロック獲得を待っているのかを確認することができます。

Deadlock イベントは既定で有効になっていないため、トレースのプロパティで [すべてのイベントを表示する] オプションから Locks を展開して明示的に選択します。

Deadlock イベントでは、デッドロックを検知した際に、XML の構造でその情報を取得し、どのオブジェクトがロックを獲得して、どのオブジェクトが解放を待っているのかを確認することができます。

Deadlock を検知すると、 Deadlock イベントの TextData には以下の様な XML 情報が記録されます。

<DeadlockGraph> <VICTIM>  <LOCK_TRANSACTION_ID>   B1C3C8B7-0797-4040-97B5-B47FBEAD94D9                                                                                                    </LOCK_TRANSACTION_ID>  <SPID>   12345  </SPID> </VICTIM>

<LOCKS>

<Lock> <LOCK_OBJECT_ID>  <Object>   <DatabaseID>    DatabaseA   </DatabaseID>  </Object> </LOCK_OBJECT_ID> <LOCK_ID>  7F34F59F-5582-4EFB-952F-9DAC7477F9E7 </LOCK_ID> <LOCK_TRANSACTION_ID>  B1C3C8B7-0797-4040-97B5-B47FBEAD94D9 </LOCK_TRANSACTION_ID> <SPID>  12345 </SPID> <LOCK_TYPE>  8 </LOCK_TYPE> <LOCK_STATUS>  1 </LOCK_STATUS></Lock>

<Lock> <LOCK_OBJECT_ID> <Object>  <DatabaseID>   DatabaseA  </DatabaseID> <DimensionID>  DimA </DimensionID> </Object> </LOCK_OBJECT_ID> <LOCK_ID>  5160B346-B3DE-4943-AD68-72630FDE038D </LOCK_ID> <LOCK_TRANSACTION_ID>  B1C3C8B7-0797-4040-97B5-B47FBEAD94D9 </LOCK_TRANSACTION_ID> <SPID>  12345 </SPID> <LOCK_TYPE>  4 </LOCK_TYPE> <LOCK_STATUS>  0 </LOCK_STATUS></Lock>

・・<略>・・

確認のポイントは、SPID、LOCK_TYPE、LOCK_STATUS です。

SPID  どのプロセスがそのオブジェクトを扱っているか把握できます。
LOCK_TYPE  Read なのか Write なのか、どのようなタイプでロックしているか把握できます。
LOCK_STATUS  ロックを取得しているのか、解放を待っているのか、その状態が把握できます。

 LOCK_TYPE の値

 名称  値  意味
LOCK_READ  0x0000002  read       - for processing
LOCK_WRITE  0x0000004  write     - for processing
LOCK_COMMIT_READ  0x0000008  commit - shared
 LOCK_COMMIT_WRITE  0x0000010  commit - exclusive

 LOCK_STATUS の値

 値  意味
0 ロック獲得待ち
1 ロック獲得済み

 

ブロッキングの確認方法

Analysis Services のブロッキングは、次のいずれかの方法で確認することができます。

(A) SQL Server Profiler の Lock Waiting イベント
(B) DISCOVER_LOCKS DMV

(A) SQL Server Profiler の Lock Waiting イベント
※SQL Server 2008 R2 Service Pack 1 から使用可能なイベントです。
SQL Server Profiler の Lock Waiting イベントで確認することができます。(出展:SQL Server 2008 R2 Analysis Services Operations Guide

(B) DISCOVER_LOCKS DMV
※SQL Server 2008 から使用可能です。
Analysis Services の動的管理ビュー(DMV) に対してクエリ実行します。

SQL Server Management Studio から、MDX を実行します。

以下のクエリを実行します。

select * from $system.discover_locks

この DMV により、ロックしている SPID と何のオブジェクトをロックしているか把握できます

select * from $system.discover_sessions

この DMV により、discover_locks で取得できた SPID と discover_sessions で取得した SESSION_SPID 紐づけ、そのセッションを実行しているユーザーアカウント、対象のデータベース等確認する事が可能です。