# バッチ設計書 6-sp_BlitzWho

## 概要

本ドキュメントは、SQL Server First Responder Kitに含まれるsp_BlitzWhoストアドプロシージャのバッチ設計書です。sp_BlitzWhoは現在SQL Serverで実行中のすべてのプロセスのスナップショットを取得するツールです。

### 本バッチの処理概要

sp_BlitzWhoは、SQL Serverで現在実行中のセッションとリクエストの詳細情報をリアルタイムで取得するストアドプロシージャです。sp_whoやsp_who2の高機能版として設計されています。

**業務上の目的・背景**：「今、何が動いているのか」を即座に把握することは、SQL Serverの運用において非常に重要です。sp_BlitzWhoは、sys.dm_exec_requests、sys.dm_exec_sessions、その他のDMVを組み合わせて、実行中のクエリテキスト、実行計画、待機情報、リソース使用状況を一度に取得します。sp_whoやsp_who2では得られない詳細情報（クエリプラン、メモリ許可、ブロッキング詳細など）を提供し、リアルタイムのトラブルシューティングを支援します。

**バッチの実行タイミング**：随時実行。パフォーマンス問題発生時の即座の診断、sp_BlitzFirstからの自動呼び出し、定期的な監視データ収集として使用されます。

**主要な処理内容**：
1. sys.dm_exec_requestsから実行中リクエストを取得
2. sys.dm_exec_sessionsからセッション情報を取得
3. sys.dm_exec_query_planから実行計画を取得
4. sys.dm_exec_sql_textからクエリテキストを取得
5. sys.dm_exec_query_memory_grantsからメモリ許可情報を取得
6. ブロッキングチェーンの分析
7. 結果の出力

**前後の処理との関連**：sp_BlitzFirstから自動的に呼び出されます（@ExpertMode=1時）。ブロッキング問題が検出された場合、sp_BlitzLockでデッドロック履歴を確認することが推奨されます。

**影響範囲**：読み取り専用の診断ツールです。DMVからの情報取得のみで、データベースに変更を加えません。実行は軽量ですが、非常に多くのセッションが存在する環境では結果セットが大きくなる可能性があります。

## バッチ種別

診断・分析

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時 |
| 実行時刻 | 任意 |
| 実行曜日 | 該当なし |
| 実行日 | 該当なし |
| トリガー | 手動/sp_BlitzFirstから呼び出し |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| SQL Serverバージョン | SQL Server 2008以降（テーブル出力は2012以降） |
| 必要権限 | VIEW SERVER STATE権限 |
| 依存オブジェクト | なし |

### 実行可否判定

- @OutputTableName指定時、@OutputDatabaseNameと@OutputSchemaNameも必要

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| @Help | TINYINT | No | 0 | ヘルプ表示 |
| @ShowSleepingSPIDs | TINYINT | No | 0 | スリープ中のSPIDを表示 |
| @ExpertMode | BIT | No | 0 | 詳細モード |
| @Debug | BIT | No | 0 | デバッグモード |
| @OutputDatabaseName | NVARCHAR(256) | No | NULL | 出力先データベース |
| @OutputSchemaName | NVARCHAR(256) | No | NULL | 出力先スキーマ |
| @OutputTableName | NVARCHAR(256) | No | NULL | 出力先テーブル |
| @OutputTableRetentionDays | TINYINT | No | 3 | 出力テーブル保持日数 |
| @MinElapsedSeconds | INT | No | 0 | 最小経過時間フィルタ |
| @MinCPUTime | INT | No | 0 | 最小CPU時間フィルタ |
| @MinLogicalReads | INT | No | 0 | 最小論理読み取りフィルタ |
| @MinPhysicalReads | INT | No | 0 | 最小物理読み取りフィルタ |
| @MinWrites | INT | No | 0 | 最小書き込みフィルタ |
| @MinTempdbMB | INT | No | 0 | 最小tempdb使用量フィルタ |
| @MinRequestedMemoryKB | INT | No | 0 | 最小メモリ要求フィルタ |
| @MinBlockingSeconds | INT | No | 0 | 最小ブロッキング秒数フィルタ |
| @CheckDateOverride | DATETIMEOFFSET | No | NULL | チェック日時オーバーライド |
| @ShowActualParameters | BIT | No | 0 | 実パラメータ値を表示 |
| @GetOuterCommand | BIT | No | 0 | 外部コマンドを取得 |
| @GetLiveQueryPlan | BIT | No | NULL | ライブクエリプラン取得 |
| @Version | VARCHAR(30) | No | NULL | バージョン（OUTPUT） |
| @VersionDate | DATETIME | No | NULL | バージョン日付（OUTPUT） |
| @VersionCheckMode | BIT | No | 0 | バージョンチェックモード |
| @SortOrder | NVARCHAR(256) | No | 'elapsed time' | ソート順 |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| sys.dm_exec_requests | DMV | 実行中リクエスト |
| sys.dm_exec_sessions | DMV | アクティブセッション |
| sys.dm_exec_query_plan | DMF | 実行計画 |
| sys.dm_exec_sql_text | DMF | クエリテキスト |
| sys.dm_exec_query_memory_grants | DMV | メモリ許可 |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| 結果セット | TABLE | 実行中プロセス一覧 |
| 指定テーブル | DB | @OutputTableName指定時 |
| _Deltasビュー | VIEW | デルタ計算用ビュー |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | 該当なし |
| 出力先 | @OutputDatabaseName.@OutputSchemaName.@OutputTableName |
| 文字コード | UTF-16 |
| 区切り文字 | 該当なし |

主要な出力カラム:
- session_id, database_name, query_text, query_plan
- elapsed_time, status, wait_info, blocking_session_id
- request_cpu_time, request_logical_reads, tempdb_allocations_mb
- memory_usage, degree_of_parallelism

## 処理フロー

### 処理シーケンス

```
1. パラメータ検証
   └─ 出力先パラメータの整合性チェック
2. 出力テーブル準備
   └─ テーブル作成/列追加/履歴削除
3. セッション情報取得
   └─ dm_exec_requests, dm_exec_sessionsの結合
4. クエリ詳細取得
   └─ クエリテキスト、実行計画の取得
5. メモリ情報取得
   └─ メモリ許可、リソースセマフォ情報
6. ブロッキング分析
   └─ ブロッキングチェーンの構築
7. 結果出力
   └─ フィルタ適用後の結果セット
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B[パラメータ検証]
    B --> C{出力テーブル指定?}
    C -->|Yes| D[テーブル準備]
    C -->|No| E[セッション情報取得]
    D --> E
    E --> F[クエリ詳細取得]
    F --> G[メモリ情報取得]
    G --> H[ブロッキング分析]
    H --> I[フィルタ適用]
    I --> J{出力先判定}
    J -->|画面| K[結果セット出力]
    J -->|テーブル| L[テーブル挿入]
    K & L --> M[バッチ終了]
```

## データベース操作仕様

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

| 処理 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| 情報取得 | sys.dm_exec_requests | SELECT | 実行中リクエスト |
| 情報取得 | sys.dm_exec_sessions | SELECT | セッション情報 |
| 結果保存 | @OutputTableName | INSERT | プロセス情報永続化 |
| 履歴削除 | @OutputTableName | DELETE | 保持期間外データ |

### テーブル別操作詳細

#### 出力テーブル

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| INSERT | 全カラム | DMVからの取得値 | 50以上のカラム |
| DELETE | - | CheckDate < @OutputTableRetentionDays | 履歴クリーンアップ |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | パラメータエラー | 出力先指定が不完全 | 全パラメータを指定 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | 0 |
| リトライ間隔 | 該当なし |
| リトライ対象エラー | 該当なし |

### 障害時対応

- 権限不足の場合はVIEW SERVER STATE権限を付与

## トランザクション仕様

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | READ UNCOMMITTED |
| コミットタイミング | 明示的管理なし |
| ロールバック条件 | 該当なし |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | アクティブセッション数 |
| 目標処理時間 | 1秒未満 |
| メモリ使用量上限 | 軽量 |

## 排他制御

- 読み取り専用のため排他制御不要

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 開始ログ | @Debug=1時 | 処理開始 |
| 進捗ログ | @Debug=1時 | SQL文 |
| 終了ログ | @Debug=1時 | 処理完了 |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| 該当なし | - | - |

## 備考

- バージョン: 8.29（2026年2月3日）
- ライセンス: MIT License
- 特記事項:
  - @OutputTableRetentionDays=3がデフォルト
  - @GetLiveQueryPlan=1でライブクエリプラン取得（SQL Server 2016以降）
  - @ShowSleepingSPIDs=1でスリープ中のセッションも表示
  - JoinKey列で時系列分析が可能
  - _Deltasビューで差分分析をサポート
