# 画面設計書 11-sp_BlitzWho結果画面

## 概要

本ドキュメントは、SQL Server First Responder Kitのsp_BlitzWhoストアドプロシージャが出力する結果画面の設計書です。sp_BlitzWhoは現在実行中のクエリをリアルタイムで詳細表示し、パフォーマンス問題の診断を支援します。

### 本画面の処理概要

sp_BlitzWho結果画面は、SQL Serverで現在実行中のセッションとクエリの詳細情報をリアルタイムで取得・表示する画面です。sp_whoやsp_who2の高機能版として、DBAやクエリチューナーがパフォーマンス問題を即座に特定できるよう設計されています。

**業務上の目的・背景**：SQL Serverで「何か遅い」「固まっている」といった問題が発生した際、どのクエリが原因かを即座に特定する必要があります。sp_BlitzWhoは、実行中クエリのCPU時間、論理読み取り、物理読み取り、メモリグラント、並列度、ブロッキング状況などを一覧表示し、問題クエリの迅速な特定を可能にします。また、ライブクエリプラン取得機能により、実行中のクエリがどこで時間を費やしているかをリアルタイムで確認できます。

**画面へのアクセス方法**：SQL Server Management Studio（SSMS）またはAzure Data Studio等のクエリツールから、以下のようにストアドプロシージャを実行します。
- 基本実行: `EXEC sp_BlitzWho;`
- ExpertMode: `EXEC sp_BlitzWho @ExpertMode = 1;`
- テーブル出力: `EXEC sp_BlitzWho @OutputDatabaseName = 'DBA', @OutputSchemaName = 'dbo', @OutputTableName = 'BlitzWho';`

**主要な操作・処理内容**：
1. 現在実行中のセッションをsys.dm_exec_sessionsとsys.dm_exec_requestsから取得
2. 待機情報（Wait Stats）をsys.dm_os_waiting_tasksから取得
3. ブロッキングチェーンをsys.sysprocessesから解析
4. クエリテキストとクエリプランをsys.dm_exec_sql_text、sys.dm_exec_query_planから取得
5. メモリグラント情報をsys.dm_exec_query_memory_grantsから取得
6. ライブクエリプラン（SQL Server 2016以降）をsys.dm_exec_query_statistics_xmlから取得
7. フィルタリング条件（@MinElapsedSecondsなど）に基づく結果のフィルタリング
8. @SortOrderに基づく結果のソート

**画面遷移**：
- sp_BlitzFirst（ExpertMode）から自動呼び出しされる場合あり
- sp_BlitzAnalysisから過去データとして参照される（テーブル出力時）
- 単独実行も可能

**権限による表示制御**：
- VIEW SERVER STATE権限が必要
- sys.dm_exec_query_statistics_xml（ライブクエリプラン）へのアクセスにはVIEW DATABASE STATE権限が追加で必要
- Azure SQL DatabaseではEngineEditionによりデフォルトデータベースの自動選択が変わる

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 6 | sp_BlitzWho | 主機能 | 現在実行中のクエリをリアルタイムで詳細表示（メモリグラント、並列度、実行プラン含む） |
| 3 | sp_BlitzFirst | 補助機能 | @ExpertMode=1時にsp_BlitzWhoを開始時・終了時に呼び出し |
| 7 | sp_BlitzAnalysis | API連携 | BlitzWhoテーブルから過去の実行中クエリ情報を取得 |

## 画面種別

一覧 / リアルタイム監視

## URL/ルーティング

T-SQLストアドプロシージャとして実行
```sql
EXEC dbo.sp_BlitzWho [@パラメータ名] = [値];
```

## 入出力項目

### 入力パラメータ

| パラメータ名 | データ型 | デフォルト値 | 説明 |
|-------------|---------|-------------|------|
| @Help | TINYINT | 0 | 1を指定するとヘルプを表示 |
| @ShowSleepingSPIDs | TINYINT | 0 | 0:アクティブのみ、1:オープントランザクションありも表示、2:全表示 |
| @ExpertMode | BIT | 0 | 1を指定すると追加の詳細列を表示 |
| @Debug | BIT | 0 | 1を指定するとデバッグSQL出力 |
| @OutputDatabaseName | NVARCHAR(256) | NULL | 出力先データベース名 |
| @OutputSchemaName | NVARCHAR(256) | NULL | 出力先スキーマ名 |
| @OutputTableName | NVARCHAR(256) | NULL | 出力先テーブル名 |
| @OutputTableRetentionDays | TINYINT | 3 | 出力テーブルの保持日数 |
| @MinElapsedSeconds | INT | 0 | 最小経過時間（秒）でフィルタ |
| @MinCPUTime | INT | 0 | 最小CPU時間（秒）でフィルタ |
| @MinLogicalReads | INT | 0 | 最小論理読み取りでフィルタ |
| @MinPhysicalReads | INT | 0 | 最小物理読み取りでフィルタ |
| @MinWrites | INT | 0 | 最小書き込みでフィルタ |
| @MinTempdbMB | INT | 0 | 最小TempDB使用量(MB)でフィルタ |
| @MinRequestedMemoryKB | INT | 0 | 最小要求メモリ(KB)でフィルタ |
| @MinBlockingSeconds | INT | 0 | 最小ブロッキング時間（秒）でフィルタ |
| @CheckDateOverride | DATETIMEOFFSET | NULL | チェック日時の上書き |
| @ShowActualParameters | BIT | 0 | 実行時パラメータを表示 |
| @GetOuterCommand | BIT | 0 | DBCC INPUTBUFFERで外部コマンドを取得 |
| @GetLiveQueryPlan | BIT | NULL | ライブクエリプラン取得（SQL 2016+ではデフォルトON） |
| @SortOrder | NVARCHAR(256) | 'elapsed time' | ソート順（session_id, query_cost, elapsed_time等） |

## 表示項目

### 基本表示項目

| 項目名 | データ型 | 説明 |
|--------|---------|------|
| run_date | DATETIME | 実行日時 |
| elapsed_time | VARCHAR(41) | 経過時間（DD:HH:MM:SS.mmm形式） |
| session_id | SMALLINT | セッションID |
| database_name | NVARCHAR(128) | データベース名 |
| query_text | NVARCHAR(MAX) | 実行中クエリのテキスト |
| query_plan | XML | 実行プラン |
| live_query_plan | XML | ライブクエリプラン（SQL 2016+） |
| query_cost | FLOAT | クエリコスト |
| status | NVARCHAR(30) | セッションステータス |
| wait_info | NVARCHAR(MAX) | 待機情報 |
| wait_resource | NVARCHAR(MAX) | 待機リソース |
| blocking_session_id | SMALLINT | ブロッキング元セッションID |
| open_transaction_count | INT | オープントランザクション数 |
| is_implicit_transaction | INT | 暗黙トランザクションフラグ |
| nt_domain | NVARCHAR(128) | NTドメイン |
| host_name | NVARCHAR(128) | ホスト名 |
| login_name | NVARCHAR(128) | ログイン名 |
| program_name | NVARCHAR(128) | プログラム名（SQL Agent Job名を含む場合あり） |

### ExpertMode追加項目

| 項目名 | データ型 | 説明 |
|--------|---------|------|
| fix_parameter_sniffing | NVARCHAR(150) | パラメータスニッフィング修正用DBCC FREEPROCCACHE文 |
| client_interface_name | NVARCHAR(32) | クライアントインターフェース名 |
| login_time | DATETIME | ログイン時刻 |
| start_time | DATETIME | クエリ開始時刻 |
| request_time | DATETIME | リクエスト時刻 |
| request_cpu_time | INT | リクエストCPU時間 |
| request_logical_reads | BIGINT | リクエスト論理読み取り |
| request_writes | BIGINT | リクエスト書き込み |
| request_physical_reads | BIGINT | リクエスト物理読み取り |
| session_cpu | INT | セッションCPU時間 |
| session_logical_reads | BIGINT | セッション論理読み取り |
| session_physical_reads | BIGINT | セッション物理読み取り |
| session_writes | BIGINT | セッション書き込み |
| tempdb_allocations_mb | DECIMAL(38,2) | TempDB割り当て(MB) |
| memory_usage | INT | メモリ使用量 |
| estimated_completion_time | BIGINT | 推定完了時間 |
| percent_complete | REAL | 完了率 |
| deadlock_priority | INT | デッドロック優先度 |
| transaction_isolation_level | VARCHAR(33) | トランザクション分離レベル |
| degree_of_parallelism | SMALLINT | 並列度 |
| grant_time | VARCHAR(20) | メモリグラント時刻 |
| requested_memory_kb | BIGINT | 要求メモリ(KB) |
| grant_memory_kb | BIGINT | 付与メモリ(KB) |
| is_request_granted | VARCHAR(39) | メモリリクエスト付与状態 |
| query_hash | BINARY(8) | クエリハッシュ |
| query_plan_hash | BINARY(8) | プランハッシュ |

## イベント仕様

### 1-プロシージャ実行

ユーザーがsp_BlitzWhoを実行すると、以下の処理が順次実行されます。

1. バージョンチェック（@VersionCheckMode=1時は即リターン）
2. @Help=1の場合はヘルプテキストを表示して終了
3. 出力テーブルが指定されている場合、テーブル作成とクリーンアップ処理
4. ブロッキング情報を@blocked一時テーブルに格納
5. ライブクエリプラン取得（@GetLiveQueryPlan=1かつSQL 2016+の場合）
6. メインクエリ構築と実行（SELECTまたはINSERT）
7. 結果を指定されたソート順で返却

### 2-テーブル出力

@OutputDatabaseName、@OutputSchemaName、@OutputTableNameが指定された場合：

1. 出力テーブルの存在確認、なければ作成
2. 新規カラムの追加（バージョンアップ時のマイグレーション）
3. @OutputTableRetentionDaysに基づく古いデータの削除
4. 差分ビューの作成（{TableName}_Deltas）
5. ExpertModeが自動的に有効化される

## データベース更新仕様

### 操作別データベース影響一覧

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| テーブル出力実行 | {OutputTableName} | INSERT | 実行中クエリ情報を記録 |
| テーブル出力実行 | {OutputTableName} | DELETE | 保持期間を超えた古いデータを削除 |
| 初回テーブル出力 | {OutputTableName} | CREATE TABLE | 出力テーブルを作成 |
| 初回テーブル出力 | {OutputTableName}_Deltas | CREATE VIEW | 差分ビューを作成 |

### テーブル別更新項目詳細

#### 出力テーブル（{OutputTableName}）

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| INSERT | ServerName | @@SERVERNAME | サーバー名 |
| INSERT | CheckDate | COALESCE(@CheckDateOverride, SYSDATETIMEOFFSET()) | チェック日時 |
| INSERT | elapsed_time | 計算値 | DD:HH:MM:SS.mmm形式 |
| INSERT | session_id | sys.dm_exec_sessions.session_id | セッションID |
| INSERT | query_text | sys.dm_exec_sql_text(sql_handle) | クエリテキスト |
| INSERT | query_plan | sys.dm_exec_query_plan(plan_handle) | 実行プラン |
| DELETE | CheckDate < @OutputTableCleanupDate | 保持日数超過 | 古いデータ削除 |

## メッセージ仕様

| メッセージ種別 | メッセージ | 発生条件 |
|--------------|----------|---------|
| ヘルプ | sp_BlitzWho from http://FirstResponderKit.org... | @Help=1 |
| 情報 | Checking for Read intent databases to exclude | AG環境でRead Intentデータベースをチェック時 |

## 例外処理

| 状態 | 説明 | 対応 |
|------|------|------|
| VIEW SERVER STATE権限なし | DMVへのアクセスが拒否される | 権限エラーが発生 |
| 出力データベースが存在しない | @OutputDatabaseNameで指定されたDBが見つからない | 処理をスキップ |
| スキーマが存在しない | @OutputSchemaNameで指定されたスキーマが見つからない | テーブル作成をスキップ |

## 備考

- SQL Server 2012以降でのみテーブル出力がサポート
- SQL Server 2016以降でライブクエリプランが利用可能
- Azure SQL Databaseでは一部の機能が制限される場合あり
- サーバーメモリが50GB以上の場合、MAX_GRANT_PERCENT=1のヒントが自動追加される
- バージョン: 8.29（2026年2月3日時点）

---

## コードリーディングガイド

本画面を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

sp_BlitzWhoは主にSQL ServerのDynamic Management Views（DMV）からデータを取得します。出力テーブルを使用する場合のスキーマを理解することが重要です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | sp_BlitzWho.sql | `sp_BlitzWho.sql` | 行180-277: 出力テーブルのスキーマ定義（INSERT文のCREATE TABLE句） |

**読解のコツ**: 出力テーブルのカラム定義は動的SQL内にあり、80以上のカラムが定義されています。ID、ServerName、CheckDate、JoinKey（計算列）が主要な識別子です。

#### Step 2: エントリーポイントを理解する

プロシージャのパラメータと初期化処理を理解します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | sp_BlitzWho.sql | `sp_BlitzWho.sql` | 行5-29: プロシージャのパラメータ定義 |
| 2-2 | sp_BlitzWho.sql | `sp_BlitzWho.sql` | 行31-42: バージョン情報とVersionCheckMode |
| 2-3 | sp_BlitzWho.sql | `sp_BlitzWho.sql` | 行45-85: @Help=1時のヘルプ出力 |

**主要処理フロー**:
1. **行36**: バージョン情報設定 `@Version = '8.29', @VersionDate = '20260203'`
2. **行38-41**: VersionCheckModeの場合は即RETURN
3. **行45-85**: ヘルプテキスト出力処理

#### Step 3: 環境検出とパラメータ初期化を理解する

SQL Serverバージョンや環境に応じた動的な設定を行う部分です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | sp_BlitzWho.sql | `sp_BlitzWho.sql` | 行88-121: バージョン検出と変数初期化 |
| 3-2 | sp_BlitzWho.sql | `sp_BlitzWho.sql` | 行124-134: @SortOrderの正規化、出力テーブル名の構築 |
| 3-3 | sp_BlitzWho.sql | `sp_BlitzWho.sql` | 行136-156: @GetLiveQueryPlanのデフォルト設定とAzure SQL DB対応 |

**主要処理フロー**:
- **行88-93**: ProductVersion、EngineEdition、Platformの検出
- **行126-127**: ProductVersionMajor/Minorの抽出
- **行136-142**: SQL 2016+ではライブクエリプランをデフォルトON

#### Step 4: 出力テーブル処理を理解する

テーブル出力が指定された場合の作成・クリーンアップ処理です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | sp_BlitzWho.sql | `sp_BlitzWho.sql` | 行158-314: 出力テーブル作成とマイグレーション |
| 4-2 | sp_BlitzWho.sql | `sp_BlitzWho.sql` | 行316-333: 古いデータのクリーンアップ |
| 4-3 | sp_BlitzWho.sql | `sp_BlitzWho.sql` | 行337-571: 差分ビュー（_Deltas）の作成 |

**主要処理フロー**:
- **行163**: ExpertModeが自動的に有効化
- **行166-283**: CREATE TABLE文の動的構築
- **行285-314**: 新規カラム追加（JoinKey、cached_parameter_info等）
- **行317**: 保持期間に基づくDELETE

#### Step 5: ブロッキングチェック処理を理解する

ブロッキングチェーンの解析ロジックです。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 5-1 | sp_BlitzWho.sql | `sp_BlitzWho.sql` | 行590-689: @BlockingCheck変数の構築 |
| 5-2 | sp_BlitzWho.sql | `sp_BlitzWho.sql` | 行681-689: ライブクエリプラン取得用SQL |

**主要処理フロー**:
- **行590-614**: @blocked一時テーブルへのブロッキング情報INSERT
- **行616-669**: @GetOuterCommand=1時のDBCC INPUTBUFFER処理（カーソル使用）
- **行674-678**: @LiveQueryPlans一時テーブルの宣言
- **行681-689**: sys.dm_exec_query_statistics_xmlからのライブプラン取得

#### Step 6: メインクエリの構築を理解する

実行中セッション情報を取得するメインSELECT文の構築部分です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 6-1 | sp_BlitzWho.sql | `sp_BlitzWho.sql` | 行692-894: SQL Server 2008/2008R2向けクエリ |
| 6-2 | sp_BlitzWho.sql | `sp_BlitzWho.sql` | 行896-1202: SQL Server 2012以降向けクエリ |
| 6-3 | sp_BlitzWho.sql | `sp_BlitzWho.sql` | 行1204-1226: フィルタリング条件の追加 |
| 6-4 | sp_BlitzWho.sql | `sp_BlitzWho.sql` | 行1228-1258: ORDER BY句の構築 |

**主要処理フロー**:
- **行915-916**: elapsed_timeの計算（DD:HH:MM:SS.mmm形式）
- **行917-926**: blocking_session_idの複雑な判定ロジック
- **行940-951**: ライブクエリプランとキャッシュパラメータ情報
- **行1113-1199**: FROM句とJOIN（sessions, requests, waiting_tasks, query_memory_grants等）

#### Step 7: 実行と出力を理解する

クエリの実行とテーブル出力の処理です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 7-1 | sp_BlitzWho.sql | `sp_BlitzWho.sql` | 行1261-1371: テーブル出力用INSERT文構築 |
| 7-2 | sp_BlitzWho.sql | `sp_BlitzWho.sql` | 行1373-1390: メモリヒントとOPTION句 |
| 7-3 | sp_BlitzWho.sql | `sp_BlitzWho.sql` | 行1396-1404: sp_executesqlによる実行 |

**主要処理フロー**:
- **行1266-1370**: INSERT...SELECT文の構築（テーブル出力時）
- **行1373**: 通常のSELECT文（非テーブル出力時）
- **行1376-1390**: 50GB以上のメモリ時のMAX_GRANT_PERCENTヒント
- **行1402-1404**: sp_executesqlでの実行

### プログラム呼び出し階層図

```
sp_BlitzWho
    |
    +-- sys.dm_exec_sessions (セッション情報)
    |      |
    |      +-- sys.dm_exec_requests (リクエスト情報)
    |      |      |
    |      |      +-- sys.dm_exec_sql_text (クエリテキスト)
    |      |      +-- sys.dm_exec_query_plan (実行プラン)
    |      |      +-- sys.dm_exec_query_statistics_xml (ライブプラン)
    |      |
    |      +-- sys.dm_os_waiting_tasks (待機タスク)
    |      +-- sys.dm_exec_session_wait_stats (セッション待機統計)
    |
    +-- sys.sysprocesses (ブロッキング解析)
    |
    +-- sys.dm_exec_query_memory_grants (メモリグラント)
    |      |
    |      +-- sys.dm_exec_query_resource_semaphores
    |
    +-- sys.resource_governor_workload_groups (リソースガバナー)
    |      |
    |      +-- sys.resource_governor_resource_pools
    |
    +-- sys.dm_tran_active_transactions (暗黙トランザクション検出)
    |      |
    |      +-- sys.dm_tran_session_transactions
    |
    +-- sys.dm_db_task_space_usage (TempDB使用量)
    |
    +-- [出力テーブル] (オプション)
           |
           +-- INSERT INTO {OutputTableName}
           +-- DELETE FROM {OutputTableName} (クリーンアップ)
```

### データフロー図

```
[入力]                           [処理]                              [出力]

@パラメータ群          ───▶  パラメータ検証・初期化
                              |
                              ▼
sys.dm_exec_sessions   ───▶  セッション情報取得       ───▶  結果セット
sys.dm_exec_requests   ───▶  リクエスト情報取得              または
sys.dm_os_waiting_tasks───▶  待機情報取得                    出力テーブル
sys.sysprocesses       ───▶  ブロッキング解析
                              |
                              ▼
sys.dm_exec_sql_text   ───▶  クエリテキスト取得
sys.dm_exec_query_plan ───▶  実行プラン取得
dm_exec_query_statistics_xml ─▶ ライブプラン取得
                              |
                              ▼
dm_exec_query_memory_grants ─▶ メモリグラント情報
dm_exec_query_resource_semaphores
                              |
                              ▼
                         フィルタリング
                         (@Min*パラメータ)
                              |
                              ▼
                         ソート
                         (@SortOrder)
                              |
                              ▼
                       [結果セット/テーブル]
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| sp_BlitzWho.sql | `sp_BlitzWho.sql` | ソース | メインストアドプロシージャ |
| sp_BlitzFirst.sql | `sp_BlitzFirst.sql` | ソース | ExpertMode時にsp_BlitzWhoを呼び出す |
| sp_BlitzAnalysis.sql | `sp_BlitzAnalysis.sql` | ソース | BlitzWhoテーブルから過去データを分析 |
