# 画面設計書 5-sp_BlitzFirst 詳細統計画面（ExpertMode）

## 概要

本ドキュメントは、SQL Server First Responder Kitのsp_BlitzFirstストアドプロシージャを@ExpertMode=1で実行した際に出力される、詳細統計画面の設計仕様を記載する。

### 本画面の処理概要

sp_BlitzFirst詳細統計画面は、@ExpertMode=1で実行した場合に追加で表示される結果セットである。Wait Stats、Perfmon Counters、File Stats、および実行中クエリ情報（sp_BlitzWho経由）を含む、詳細なパフォーマンス統計を提供する。

**業務上の目的・背景**：sp_BlitzFirstの標準モードでは、検出された問題の概要のみが表示される。しかし、パフォーマンス問題の根本原因を特定するには、Wait Stats、I/O統計、Perfmonカウンターなどの詳細データが必要になることが多い。ExpertModeでは、これらの詳細統計を追加の結果セットとして提供し、DBAが問題の深掘り分析を行えるようにする。さらに、サンプリング開始時と終了時のsp_BlitzWho結果により、問題発生時に実行されていたクエリを特定できる。

**画面へのアクセス方法**：`EXEC sp_BlitzFirst @ExpertMode = 1`を実行することで、標準診断結果に加えて詳細統計画面にアクセスできる。@ExpertMode = 2を指定すると、sp_BlitzWhoを除いた統計のみが表示される。

**主要な操作・処理内容**：
1. サンプリング開始時のsp_BlitzWho結果を表示（@ExpertMode=1のみ）
2. 標準診断結果（Findings）を表示
3. File Stats（ファイルI/O統計）を表示
4. Perfmon Stats（パフォーマンスカウンター）を表示
5. Wait Stats（待機統計）を表示
6. BlitzCache結果を表示（@OutputTableNameBlitzCache指定時）
7. サンプリング終了時のsp_BlitzWho結果を表示（@ExpertMode=1のみ）

**画面遷移**：
- この画面から遷移できる画面：sp_BlitzCache結果画面（詳細分析時）
- この画面に遷移してくる画面：sp_BlitzFirst診断結果画面（@ExpertMode指定時）

**権限による表示制御**：sp_BlitzFirstと同じ権限要件。sp_BlitzWhoの呼び出しには、sp_BlitzWhoがインストールされている必要がある。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 3 | sp_BlitzFirst | 主機能 | @ExpertMode=1時にWait Stats、Perfmon Counters、File Stats等の詳細情報を表示 |
| 6 | sp_BlitzWho | 補助機能 | ExpertModeでも開始時と終了時にsp_BlitzWhoを呼び出し |
| 2 | sp_BlitzCache | 補助機能 | @OutputTableNameBlitzCache指定時にsp_BlitzCacheを呼び出しキャッシュ分析を実行 |

## 画面種別

複合（複数結果セット表示）

## URL/ルーティング

```sql
-- ExpertMode（sp_BlitzWho + 統計）
EXEC sp_BlitzFirst @ExpertMode = 1;

-- ExpertMode（統計のみ、sp_BlitzWhoなし）
EXEC sp_BlitzFirst @ExpertMode = 2;

-- ExpertMode + BlitzCache結果保存
EXEC sp_BlitzFirst
    @ExpertMode = 1,
    @OutputTableNameBlitzCache = 'BlitzCache';

-- 起動以降の統計（自動的にExpertMode）
EXEC sp_BlitzFirst @SinceStartup = 1;
```

## 入出力項目

### 入力パラメータ（ExpertMode関連）

| パラメータ名 | データ型 | デフォルト値 | 説明 |
|-------------|---------|-------------|------|
| @ExpertMode | TINYINT | 0 | 詳細モード（0:標準/1:詳細+sp_BlitzWho/2:詳細のみ） |
| @OutputResultSets | NVARCHAR(500) | 'BlitzWho_Start\|Findings\|FileStats\|PerfmonStats\|WaitStats\|BlitzCache\|BlitzWho_End' | 出力する結果セットの指定 |
| @OutputTableNameBlitzCache | NVARCHAR(256) | NULL | BlitzCache結果の出力テーブル名 |

## 表示項目

### 結果セット1: BlitzWho_Start（サンプリング開始時）

sp_BlitzWhoの結果セット。実行中クエリの詳細情報。

| 列名 | データ型 | 説明 |
|-----|---------|------|
| (sp_BlitzWhoの出力列) | - | 実行中クエリ、メモリグラント、並列度等 |

### 結果セット2: Findings（標準診断結果）

sp_BlitzFirst標準の診断結果。

### 結果セット3: FileStats（ファイルI/O統計）

| 列名 | データ型 | 説明 |
|-----|---------|------|
| DatabaseID | INT | データベースID |
| DatabaseName | NVARCHAR(256) | データベース名 |
| FileID | INT | ファイルID |
| FileLogicalName | NVARCHAR(256) | ファイル論理名 |
| TypeDesc | NVARCHAR(60) | ファイルタイプ（ROWS/LOG） |
| SizeOnDiskMB | BIGINT | ディスク上のサイズ（MB） |
| io_stall_read_ms | BIGINT | 読み取り待機時間（ms） |
| num_of_reads | BIGINT | 読み取り回数 |
| bytes_read | BIGINT | 読み取りバイト数 |
| io_stall_write_ms | BIGINT | 書き込み待機時間（ms） |
| num_of_writes | BIGINT | 書き込み回数 |
| bytes_written | BIGINT | 書き込みバイト数 |
| PhysicalName | NVARCHAR(520) | 物理ファイルパス |
| avg_stall_read_ms | INT | 平均読み取り待機時間（ms） |
| avg_stall_write_ms | INT | 平均書き込み待機時間（ms） |

### 結果セット4: PerfmonStats（パフォーマンスカウンター）

| 列名 | データ型 | 説明 |
|-----|---------|------|
| object_name | NVARCHAR(128) | オブジェクト名 |
| counter_name | NVARCHAR(128) | カウンター名 |
| instance_name | NVARCHAR(128) | インスタンス名 |
| cntr_value | BIGINT | カウンター値 |
| value_delta | BIGINT | サンプリング期間中の変化量 |
| value_per_second | DECIMAL(18,2) | 秒あたりの値 |

### 主要なPerfmonカウンター

| カウンター | 説明 |
|-----------|------|
| Page life expectancy | ページキャッシュ内滞在時間 |
| Batch Requests/sec | 秒あたりバッチリクエスト数 |
| SQL Compilations/sec | 秒あたりコンパイル数 |
| SQL Re-Compilations/sec | 秒あたり再コンパイル数 |
| Buffer cache hit ratio | バッファキャッシュヒット率 |
| Checkpoint pages/sec | 秒あたりチェックポイントページ数 |
| Free list stalls/sec | フリーリストストール数 |
| Lazy writes/sec | 秒あたりLazy Writer書き込み数 |

### 結果セット5: WaitStats（待機統計）

| 列名 | データ型 | 説明 |
|-----|---------|------|
| wait_type | NVARCHAR(60) | 待機タイプ |
| wait_time_ms | BIGINT | 待機時間（ms） |
| signal_wait_time_ms | BIGINT | シグナル待機時間（ms） |
| waiting_tasks_count | BIGINT | 待機タスク数 |

### 主要な待機タイプカテゴリ

| カテゴリ | 説明 | 代表的な待機タイプ |
|---------|------|------------------|
| CPU | CPU関連 | SOS_SCHEDULER_YIELD, CXPACKET |
| I/O | ディスクI/O | PAGEIOLATCH_*, WRITELOG |
| Lock | ロック待機 | LCK_M_* |
| Memory | メモリ関連 | RESOURCE_SEMAPHORE |
| Network | ネットワーク | ASYNC_NETWORK_IO |
| Buffer | バッファ関連 | PAGELATCH_* |

### 結果セット6: BlitzCache（オプション）

@OutputTableNameBlitzCache指定時のsp_BlitzCache結果。

### 結果セット7: BlitzWho_End（サンプリング終了時）

sp_BlitzWhoの結果セット。サンプリング終了時点の実行中クエリ。

## イベント仕様

### 1-ExpertMode実行フロー

@ExpertMode=1で実行した場合の結果セット出力順序：

1. sp_BlitzWho（開始時） - @OutputResultSetsに'BlitzWho_Start'含む場合
2. Findings（診断結果） - @OutputResultSetsに'Findings'含む場合
3. FileStats - @OutputResultSetsに'FileStats'含む場合
4. PerfmonStats - @OutputResultSetsに'PerfmonStats'含む場合
5. WaitStats - @OutputResultSetsに'WaitStats'含む場合
6. BlitzCache - @OutputResultSetsに'BlitzCache'含む場合
7. sp_BlitzWho（終了時） - @OutputResultSetsに'BlitzWho_End'含む場合

### 2-@OutputResultSetsによる制御

| @OutputResultSets値 | 出力される結果セット |
|-------------------|-------------------|
| 'BlitzWho_Start\|Findings\|FileStats\|PerfmonStats\|WaitStats\|BlitzCache\|BlitzWho_End' | すべて（デフォルト） |
| 'Findings\|WaitStats' | Findingsと WaitStatsのみ |
| 'BlitzWho_Start\|BlitzWho_End' | sp_BlitzWhoのみ |

### 3-@ExpertMode値による動作差異

| @ExpertMode | sp_BlitzWho | FileStats | PerfmonStats | WaitStats | BlitzCache |
|------------|-------------|-----------|--------------|-----------|------------|
| 0 | なし | なし | なし | なし | なし |
| 1 | 開始/終了時 | あり | あり | あり | オプション |
| 2 | なし | あり | あり | あり | オプション |

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| FileStats取得 | #FileStats | INSERT | ファイル統計を格納（Pass 1/2） |
| PerfmonStats取得 | #PerfmonStats | INSERT | Perfmon統計を格納（Pass 1/2） |
| WaitStats取得 | #WaitStats | INSERT | Wait統計を格納（Pass 1/2） |
| 出力テーブル指定時 | @OutputTableNameFileStats | INSERT | ファイル統計を永続化 |
| 出力テーブル指定時 | @OutputTableNamePerfmonStats | INSERT | Perfmon統計を永続化 |
| 出力テーブル指定時 | @OutputTableNameWaitStats | INSERT | Wait統計を永続化 |

## メッセージ仕様

ExpertMode固有のメッセージはない。sp_BlitzFirst標準のメッセージを参照。

## 例外処理

| 例外状況 | 動作 |
|---------|------|
| sp_BlitzWhoが未インストール | 警告メッセージを表示し、BlitzWho結果セットをスキップ |
| @ExpertMode=2でsp_BlitzWho呼び出し回避 | BlitzWho結果セットは出力されない |

## 備考

- @SinceStartup=1指定時は自動的に@ExpertMode=1に変更される
- @Seconds=0の場合、サンプリングは行われず、起動以降の累計統計が表示される
- 出力テーブルを指定すると、データを永続化して後からsp_BlitzAnalysisで分析可能
- @OutputResultSetsで不要な結果セットを除外可能

---

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

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

### 推奨読解順序

#### Step 1: 結果セット制御を理解する

@OutputResultSetsによる結果セット制御を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | sp_BlitzFirst.sql | `sp_BlitzFirst.sql` | 行22: @OutputResultSetsパラメータ定義 |
| 1-2 | sp_BlitzFirst.sql | `sp_BlitzFirst.sql` | @OutputResultSets判定処理部分 |

#### Step 2: 統計取得処理を理解する

各統計情報の取得処理を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | sp_BlitzFirst.sql | `sp_BlitzFirst.sql` | 行435-456: #FileStatsテーブル定義とデータソース |
| 2-2 | sp_BlitzFirst.sql | `sp_BlitzFirst.sql` | 行484-495: #PerfmonStatsテーブル定義 |
| 2-3 | sp_BlitzFirst.sql | `sp_BlitzFirst.sql` | 行423-433: #WaitStatsテーブル定義 |

**主要処理フロー**:
- sys.dm_io_virtual_file_stats → #FileStats
- sys.dm_os_performance_counters → #PerfmonStats
- sys.dm_os_wait_stats → #WaitStats

#### Step 3: sp_BlitzWho連携を理解する

ExpertModeでのsp_BlitzWho呼び出しを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | sp_BlitzFirst.sql | `sp_BlitzFirst.sql` | 行137: @BlitzWhoコマンド構築 |
| 3-2 | sp_BlitzFirst.sql | `sp_BlitzFirst.sql` | 行283-293: 呼び出し条件判定 |

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

```
sp_BlitzFirst (@ExpertMode = 1)
    │
    ├─ sp_BlitzWho呼び出し（開始時）
    │      └─ 結果セット: BlitzWho_Start
    │
    ├─ Findings結果セット生成
    │
    ├─ FileStats結果セット生成
    │      └─ sys.dm_io_virtual_file_stats
    │
    ├─ PerfmonStats結果セット生成
    │      └─ sys.dm_os_performance_counters
    │
    ├─ WaitStats結果セット生成
    │      └─ sys.dm_os_wait_stats
    │
    ├─ BlitzCache呼び出し（オプション）
    │      └─ sp_BlitzCache
    │
    └─ sp_BlitzWho呼び出し（終了時）
           └─ 結果セット: BlitzWho_End
```

### データフロー図

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

@ExpertMode = 1 ───────▶ sp_BlitzFirst ─────────────▶ 結果セット群
                              │
                              ▼
    sys.dm_io_virtual_file_stats ──▶ FileStats
    sys.dm_os_performance_counters ──▶ PerfmonStats
    sys.dm_os_wait_stats ──▶ WaitStats
    sp_BlitzWho ──▶ BlitzWho_Start/End
    sp_BlitzCache ──▶ BlitzCache（オプション）
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| sp_BlitzFirst.sql | `sp_BlitzFirst.sql` | ソース | メインプロシージャ定義 |
| sp_BlitzWho.sql | `sp_BlitzWho.sql` | ソース | 実行中クエリ取得 |
| sp_BlitzCache.sql | `sp_BlitzCache.sql` | ソース | キャッシュ分析（オプション呼び出し） |
