ITエンジニアの成長ブログ

ITエンジニアとして行う勉強の発信&日々の生活で体験した楽しいことをゆるく発信

SQL Serverでリアルタイムにブロッキングの状態を見る

先日、SQL Serverデッドロック関連について調べていたところブロッキングの状態を簡単に見ることができる便利なコマンドを見つけましたのでここにメモをしておきます。

そのコマンドとは、システムストアドプロシージャのsp_whoです。
sp_who (Transact-SQL) - SQL Server | Microsoft Learn

実行すると、SQL Serverインスタンス内の現在のプロセスの状態を確認することができるようです。

実際に私のローカル環境で試してみたところ、以下のようにいくつかのレコードが出力されました。

sp_who実行結果


ユーザーの操作とは関係ないものが大多数ですが、この情報からたとえばあるプロセスがどのプロセスによってブロッキングされているかが分かります。

若干分かりづらいですが、上記の図だと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エンジニアの成長ブログ


今回も最後までお読みいただきありがとうございました。今回はこの辺で失礼いたします。