SQL Server システム存储プロセス sp_who によるセッション監視

Microsoft SQL Server 環境において、現在の接続セッションやバックエンドプロセスの状態を調査するには、システム存储プロセス sp_who が有用です。この機能を利用することで、アクティブなユーザー、アイドル状態のプロセス、およびリソース競合の原因となっているブロッキング情報を把握できます。

構文と使用方法

基本構文は以下の通りです。オプションの引数により、情報のフィルタリングが可能です。

EXECUTE sp_who [ @login_name = ] 'identifier'

パラメータ详解

@login_name には、調査対象のログイン名、特定のプロセス ID(SPID)、またはキーワード ACTIVE を指定します。

  • ログイン名: 特定のユーザーに関連するセッションのみを表示します。
  • SPID: 数値を指定すると、そのプロセス ID に対応する詳細情報を返します。
  • ACTIVE: 文字列 'ACTIVE' を指定すると、ユーザーからの次の命令を待っている(アイドル状態の)プロセスを除外し、現在実行中のプロセスのみをリストアップします。

引数を省略した場合、サーバー上のすべてのアクティブなセッション情報が返されます。実行が成功すれば 0、失敗すれば 1 が戻りコードとして返されます。

結果セットの構造

この存储プロセスは、以下の列を含む結果セットを生成します。結果は SPID の昇順でソートされます。

列名データ型説明
spidsmallintシステムプロセス識別番号。
ecidsmallint実行コンテキスト ID。並列クエリの場合、主スレッドは 0、子スレッドは 1 以上の値を持ちます。
statusnchar(30)現在のプロセス状態(例:running, sleeping, background)。
loginamenchar(128)セッションを開始したログイン名。
hostnamenchar(128)クライアント计算机名。
blkchar(5)ブロッキング元の SPID。ブロックされていない場合は 0 です。孤立した分散トランザクションによるブロックは '-2' で示されます。
dbnamenchar(128)プロセスが現在使用しているデータベース名。
cmdnchar(16)実行中の命令種類(SELECT, INSERT, AWAITING COMMAND など)。

システムプロセス ID の規則

SQL Server では、SPID 1 から 50 までの値はシステム内部プロセス用に予約されています。ユーザーセッションは通常 51 以降の番号が割り当てられます。また、孤立した DTC(分散トランザクションコーディネータ)トランザクションは SPID '-2' として識別され、これが他のプロセスをブロックしている場合、blk 列に '-2' が表示されます。

実行例

以下の例では、さまざまなフィルタ条件を使用してプロセス情報を取得する方法を示します。

1. 全セッションのリスト取得

引数なしで実行し、すべての接続状況を確認します。

USE master;
GO
EXEC sp_who;
GO

実行結果の例(一部抜粋):

spid ecid status     loginame       hostname  blk dbname   cmd
---- ---- ------     ------------   --------  --- ------   -----
1    0    background sa                       0   master   LAZY WRITER
55   0    runnable   dev_user       client01  0   SalesDB  INSERT
55   1    runnable   dev_user       client01  0   SalesDB  INSERT
56   0    sleeping   admin_user     client02  0   master   AWAITING COMMAND

2. 特定ユーザーのフィルター

ログイン名 'dev_user' に関連するプロセスのみを表示します。

EXEC sp_who 'dev_user';

3. アクティブプロセスの抽出

アイドル状態を除く、現在処理中のプロセスのみをリストします。

EXEC sp_who 'ACTIVE';

4. 特定プロセス ID の調査

SPID 55 の詳細な状態を確認します。

EXEC sp_who 55;

権限と関連情報

この存储プロセスの実行権限は、デフォルトで public ロールに付与されています。より詳細なロック情報が必要な場合は sp_lock を、プロセス终止には KILL 命令を、システムテーブルからの直接検索には sysprocesses を参照してください。

タグ: sql-server Transact-SQL system-stored-procedures database-monitoring

6月16日 17:27 投稿