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 紐づけ、そのセッションを実行しているユーザーアカウント、対象のデータベース等確認する事が可能です。