SQL Server Profiler を使用したデッドロックの分析
SQL Server Profilerを使用して、デッドロックの原因を特定します。デッドロックは、SQL Server 内のリソースの集合に対して複数のスレッド間またはプロセス間で相互に依存関係があるときに発生します。SQL Server Profilerを使用すると、分析用にデッドロック イベントを記録、再生、および表示するトレースを作成できます。
デッドロック イベントをトレースするには、Deadlock Graph イベント クラスをトレースに追加します。このイベント クラスにより、デッドロックに関連するプロセスとオブジェクトに関する XML データが、トレースの TextData データ列に設定されます。SQL Server Profiler では、この XML ドキュメントをデッドロック XML (.xdl) ファイルに抽出して、後で SQL Server Management Studio で表示できます。Deadlock Graph イベントを、すべての Deadlock Graph イベントが含まれた 1 つのファイルに抽出するか、または個別のファイルに抽出するように SQL Server Profiler を構成できます。この抽出は、次の方法のいずれかを使用して実行できます。
トレースの構成時に、[イベント抽出の設定] タブを使用します。このタブは、[イベントの選択] タブで Deadlock Graph イベントを選択していないと表示されないので注意してください。
[ファイル] メニューの [SQL Server イベントの抽出] オプションを使用します。
特定のイベントを右クリックし、[イベント データの抽出] をクリックすることにより、個々のイベントを抽出して保存することもできます。
Deadlock Graph
SQL Server Profiler と SQL Server Management Studio では、Deadlock Wait-for Graph を使用して、デッドロックを説明します。Deadlock Wait-for Graph には、プロセス ノード、リソース ノード、およびプロセスとリソース間の関係を表すエッジが含まれています。次の表では、Deadlock Wait-for Graph の構成要素を定義します。
プロセス ノード
INSERT、UPDATE、DELETE などのタスクを実行するスレッド。リソース ノード
テーブル、インデックス、行などのデータベース オブジェクト。エッジ
プロセスとリソース間の関係。requestエッジは、プロセスがリソースを待機したときに発生します。ownerエッジは、リソースがプロセスを待機したときに発生します。ロック モードは、エッジの記述に含まれます。たとえば、"モード: X" などです。ロック モードを指定する際の値の詳細については、「ロック モード」を参照してください。
デッドロック プロセス ノード
Deadlock Wait-for Graph には、プロセス ノードにプロセスに関する情報が含まれています。次の表で、プロセスの構成要素について説明します。
構成要素 |
定義 |
---|---|
[サーバー プロセス ID] |
サーバー プロセス ID (SPID)。ロックを所有しているプロセスのサーバー割り当て ID です。 |
[サーバー バッチ ID] |
サーバー バッチ ID (SBID)。 |
[実行コンテキスト ID] |
実行コンテキスト ID (ECID)。特定の SPID に関連付けられている特定のスレッドの実行コンテキスト ID です。 ECID = {0, 1, 2, 3, ......n}。0 は常にメイン スレッドまたは親スレッドを表し、{1, 2, 3, ......n} は、サブスレッドを表します。 |
[デッドロックの優先度] |
プロセスのデッドロックの優先度。使用できる値の詳細については、「SET DEADLOCK_PRIORITY (Transact-SQL)」を参照してください。 |
[使用されたログ] |
プロセスで使用されたログ領域の量。 |
[所有者 ID] |
トランザクションを使用しており、現在ロックを待機しているプロセスのトランザクション ID。 |
[トランザクション記述子] |
トランザクションの状態を記述するトランザクション記述子へのポインタ。 |
[入力バッファ] |
現在のプロセスの入力バッファ。イベントの種類と実行中のステートメントを定義します。有効値は次のとおりです。
|
[ステートメント] |
ステートメントの種類。有効値は次のとおりです。
|
デッドロック リソース ノード
デッドロックにおいて、2 つのプロセスが、他のプロセスで使用されているリソースをそれぞれ待機しています。Deadlock Graph では、これらのリソースがリソース ノードとして表示されます。各リソースは、「ロックの粒度と階層」の一覧に記載されている種類のいずれかに当てはまります。