先日、SQL Serverでデッドロック関連について調べていたところブロッキングの状態を簡単に見ることができる便利なコマンドを見つけましたのでここにメモをしておきます。
そのコマンドとは、システムストアドプロシージャのsp_whoです。
sp_who (Transact-SQL) - SQL Server | Microsoft Learn
実行すると、SQL Serverインスタンス内の現在のプロセスの状態を確認することができるようです。
実際に私のローカル環境で試してみたところ、以下のようにいくつかのレコードが出力されました。
ユーザーの操作とは関係ないものが大多数ですが、この情報からたとえばあるプロセスがどのプロセスによってブロッキングされているかが分かります。
若干分かりづらいですが、上記の図だとspid=68のstatusは「suspended」になっており、何らかのイベントを待っている状態です。
さらに、spid=68のblkカラムが「56」となっていますが、これはブロッキングされている場合はそのspidを表しており、このspid=68のセッションは、spid=56のセッションにブロッキングされていると解釈できます。
重要だと思うカラムの意味を以下に抜粋します。
カラム名 | データ型 | 説明 |
---|---|---|
spid | smallint | セッションID |
status | nchar(30) | プロセスの状態(詳細は冒頭のリンクより確認できます) |
loginname | nchar(128) | 特定のプロセスに関連付けられているログイン名 |
Blk | char(5) | ブロック中のプロセスが存在する場合は、そのプロセスのセッションID。存在しない場合は、0 |
Dbname | nchar(128) | プロセスによって使用されるデータベース |
使い方はざっとこのような形で、引数を使ってあるログインやセッションIDでフィルターすることもできます。詳細は冒頭のリンクからご確認いただければと思います。
因みに、SQL Serverのインスタンスで実行中のすべてのセッションを表示するには、サーバーに対する VIEW SERVER STATE 権限が必要です。 権限がない場合、ユーザーは現在のセッションだけを確認できます。
おわりに
あまり、リアルタイムにブロッキングの状態を見ることは少ないかもしれませんが、もしもの時に役立つと思います。
因みに今回のsp_whoのコマンドの実行結果は、以前トランザクションのロックを解放する方法を記載した記事で使用した利用状況モニターと似たような結果を取得することができます。よろしれければ以下ご参考までにリンクを張っておきます。
SQL Serverでトランザクションのロックを解放する方法② - ITエンジニアの成長ブログ
今回も最後までお読みいただきありがとうございました。今回はこの辺で失礼いたします。