SQL Server Profiler を使用したデッドロックの分析

適用対象: SQL ServerAzure SQL Managed Instance

SQL Server プロファイラー を使用して、デッドロックの原因を特定します。 デッドロックは、SQL Server 内のリソースの集合に対して複数のスレッド間またはプロセス間で相互に依存関係があるときに発生します。 SQL Server プロファイラーを使用すると、分析用にデッドロック イベントを記録、再生、および表示するトレースを作成できます。

デッドロック イベントをトレースするには、 Deadlock Graph イベント クラスをトレースに追加します。 このイベント クラスにより、デッドロックに関連するプロセスとオブジェクトに関する XML データが、トレースの TextData データ列に設定されます。 SQL Server プロファイラー では、この XML ドキュメントをデッドロック XML (.xdl) ファイルに抽出して、後で SQL Server Management Studio で表示できます。 SQL Server プロファイラー Deadlock Graph イベントを、すべての Deadlock Graph イベントが含まれた 1 つのファイルに抽出するか、または個別のファイルに抽出するように を構成できます。 この抽出は、次の方法のいずれかを使用して実行できます。

  • トレースの構成時に、 [イベント抽出の設定] タブを使用する。このタブは、 [イベントの選択] タブで Deadlock Graph イベントを選択していないと表示されないので注意してください。

  • [ファイル] メニューの [SQL Server イベントの抽出] オプションを使用する。

  • 特定のイベントを右クリックし、 [イベント データの抽出] をクリックすることにより、個々のイベントを抽出して保存することもできます。

Deadlock Graph

SQL Server プロファイラー と SQL Server Management Studio では、Deadlock Wait-for Graph を使用してデッドロックが説明されます。 Deadlock Wait-for Graph には、プロセス ノード、リソース ノード、およびプロセスとリソース間の関係を表すエッジが含まれています。 次の表では、Deadlock Wait-for Graph の構成要素を定義します。

プロセス ノード
INSERT、UPDATE、DELETE などのタスクを実行するスレッド。

リソース ノード
テーブル、インデックス、行などのデータベース オブジェクト。

Edge
プロセスとリソース間の関係。 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。
[トランザクション記述子] トランザクションの状態を記述するトランザクション記述子へのポインター。
[入力バッファー] 現在のプロセスの入力バッファー。イベントの種類と実行中のステートメントを定義します。 指定できる値は、次のとおりです。

Language

RPC

なし
ステートメント ステートメントの種類。 次のいずれかの値になります。

NOP

SELECT

UPDATE

INSERT

DELETE

Unknown

デッドロック リソース ノード

デッドロックにおいて、2 つのプロセスが、他のプロセスで使用されているリソースをそれぞれ待機しています。 Deadlock Graph では、これらのリソースがリソース ノードとして表示されます。