# バッチ設計書 3-sp_BlitzFirst

## 概要

本ドキュメントは、SQL Server First Responder Kitに含まれるsp_BlitzFirstストアドプロシージャのバッチ設計書です。sp_BlitzFirstは現在実行中の処理を分析し、SQL Serverが遅い原因を優先度リストで提供するリアルタイム診断ツールです。

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

sp_BlitzFirstは、SQL Serverの「今、何が起きているか」をリアルタイムで診断し、パフォーマンス問題の原因を優先度付きで提示するストアドプロシージャです。待機統計、ファイルI/O統計、Perfmonカウンター、実行中クエリを収集・分析します。

**業務上の目的・背景**：「SQL Serverが遅い」という問い合わせに対して、DBAが迅速に原因を特定する必要があります。sp_BlitzFirstは、指定された秒数（デフォルト5秒）の間にサンプリングを行い、待機統計の変化、I/Oレイテンシ、CPU使用率、現在実行中のクエリなどを総合的に分析して、最も可能性の高い原因を優先度順に提示します。これにより、トラブルシューティング時間を大幅に短縮できます。

**バッチの実行タイミング**：パフォーマンス問題発生時に随時実行。または、定期的に実行してテーブルに出力を保存し、後から分析することも可能です。

**主要な処理内容**：
1. 開始時点のスナップショット取得（待機統計、ファイル統計、Perfmonカウンター）
2. 指定秒数の待機（デフォルト5秒）
3. 終了時点のスナップショット取得
4. デルタ（差分）の計算と分析
5. sp_BlitzWhoによる実行中クエリの取得（オプション）
6. sp_BlitzCacheによるプランキャッシュ分析（オプション）
7. 問題の優先度付けと出力

**前後の処理との関連**：sp_BlitzFirstは内部でsp_BlitzWhoとsp_BlitzCacheを呼び出すことができます。また、sp_BlitzAnalysisで過去のsp_BlitzFirst出力を分析することができます。

**影響範囲**：読み取り専用の診断ツールですが、サンプリング期間中にDMVからデータを収集するため、わずかなオーバーヘッドが発生します。本番環境での使用は安全ですが、極端に短い間隔での連続実行は避けてください。

## バッチ種別

診断・分析

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時/定期（監視用途） |
| 実行時刻 | 任意 |
| 実行曜日 | 該当なし |
| 実行日 | 該当なし |
| トリガー | 手動/スケジュール |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| SQL Serverバージョン | SQL Server 2008以降 |
| 必要権限 | VIEW SERVER STATE権限 |
| 依存オブジェクト | sp_BlitzWho（オプション）、sp_BlitzCache（オプション） |

### 実行可否判定

- @OutputTypeがNONEの場合、@OutputDatabaseName等が必須
- @Seconds=0と@SinceStartup=1は起動時からの累積統計を表示

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| @LogMessage | NVARCHAR(4000) | No | NULL | ログテーブルにメッセージを記録 |
| @Help | TINYINT | No | 0 | ヘルプ表示 |
| @AsOf | DATETIMEOFFSET | No | NULL | 過去のデータを参照する日時 |
| @ExpertMode | TINYINT | No | 0 | 詳細モード |
| @Seconds | INT | No | 5 | サンプリング秒数 |
| @OutputType | VARCHAR(20) | No | 'TABLE' | 出力形式 |
| @OutputServerName | NVARCHAR(256) | No | NULL | 出力先サーバー |
| @OutputDatabaseName | NVARCHAR(256) | No | NULL | 出力先データベース |
| @OutputSchemaName | NVARCHAR(256) | No | NULL | 出力先スキーマ |
| @OutputTableName | NVARCHAR(256) | No | NULL | 出力先テーブル |
| @OutputTableNameFileStats | NVARCHAR(256) | No | NULL | ファイル統計出力テーブル |
| @OutputTableNamePerfmonStats | NVARCHAR(256) | No | NULL | Perfmon統計出力テーブル |
| @OutputTableNameWaitStats | NVARCHAR(256) | No | NULL | 待機統計出力テーブル |
| @OutputTableNameBlitzCache | NVARCHAR(256) | No | NULL | BlitzCache出力テーブル |
| @OutputTableNameBlitzWho | NVARCHAR(256) | No | NULL | BlitzWho出力テーブル |
| @OutputResultSets | NVARCHAR(500) | No | 複合値 | 出力する結果セット |
| @OutputTableRetentionDays | TINYINT | No | 7 | 出力テーブルの保持日数 |
| @OutputXMLasNVARCHAR | TINYINT | No | 0 | XMLをNVARCHARで出力 |
| @FilterPlansByDatabase | VARCHAR(MAX) | No | NULL | データベースでプランをフィルタ |
| @CheckProcedureCache | TINYINT | No | 0 | プロシージャキャッシュをチェック |
| @CheckServerInfo | TINYINT | No | 1 | サーバー情報をチェック |
| @FileLatencyThresholdMS | INT | No | 100 | ファイルレイテンシ閾値（ミリ秒） |
| @SinceStartup | TINYINT | No | 0 | 起動時からの統計を表示 |
| @ShowSleepingSPIDs | TINYINT | No | 0 | スリープ中のSPIDを表示 |
| @BlitzCacheSkipAnalysis | BIT | No | 1 | BlitzCacheの分析をスキップ |
| @MemoryGrantThresholdPct | DECIMAL(5,2) | No | 15.00 | メモリ許可閾値（%） |
| @Debug | BIT | No | 0 | デバッグモード |
| @Version | VARCHAR(30) | No | NULL | バージョン（OUTPUT） |
| @VersionDate | DATETIME | No | NULL | バージョン日付（OUTPUT） |
| @VersionCheckMode | BIT | No | 0 | バージョンチェックモード |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| sys.dm_os_wait_stats | DMV | 待機統計 |
| sys.dm_io_virtual_file_stats | DMF | ファイルI/O統計 |
| sys.dm_os_performance_counters | DMV | Perfmonカウンター |
| sys.dm_exec_requests | DMV | 実行中リクエスト |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| 結果セット | TABLE | 優先度付きの問題リスト |
| BlitzFirst | DB | @OutputTableName指定時 |
| BlitzFirst_FileStats | DB | ファイル統計（デルタビュー含む） |
| BlitzFirst_PerfmonStats | DB | Perfmon統計（アクチュアルビュー含む） |
| BlitzFirst_WaitStats | DB | 待機統計（デルタビュー含む） |

### 出力ファイル仕様

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

## 処理フロー

### 処理シーケンス

```
1. パラメータ検証
   └─ @OutputType='NONE'時の出力先チェック
2. 開始スナップショット取得
   └─ 待機統計、ファイル統計、Perfmonの初期値
3. sp_BlitzWho実行（@ExpertMode=1時）
   └─ 開始時点の実行中クエリ
4. WAITFOR DELAY
   └─ @Seconds秒待機
5. 終了スナップショット取得
   └─ 各統計の終了値
6. デルタ計算
   └─ 開始-終了の差分算出
7. 問題分析と優先度付け
   └─ 待機、I/O、メモリ等の問題検出
8. sp_BlitzCache実行（オプション）
9. sp_BlitzWho実行（終了時）
10. 結果出力
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B[パラメータ検証]
    B --> C[開始スナップショット取得]
    C --> D{@ExpertMode=1?}
    D -->|Yes| E[sp_BlitzWho開始]
    D -->|No| F[WAITFOR DELAY]
    E --> F
    F --> G[終了スナップショット取得]
    G --> H[デルタ計算]
    H --> I[問題分析]
    I --> J{@CheckProcedureCache?}
    J -->|Yes| K[sp_BlitzCache実行]
    J -->|No| L[結果出力]
    K --> L
    L --> M{@ExpertMode=1?}
    M -->|Yes| N[sp_BlitzWho終了]
    M -->|No| O[バッチ終了]
    N --> O
```

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

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

| 処理 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| 統計取得 | sys.dm_os_wait_stats | SELECT | 待機統計 |
| 統計取得 | sys.dm_io_virtual_file_stats | SELECT | ファイルI/O統計 |
| 結果保存 | BlitzFirst | INSERT | 診断結果 |
| 結果保存 | BlitzFirst_WaitStats | INSERT | 待機統計デルタ |
| 履歴削除 | 各出力テーブル | DELETE | @OutputTableRetentionDays以前のデータ |

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

#### #BlitzFirstResults（一時テーブル）

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| INSERT | Priority, Finding, Details, etc. | 分析結果 | セッション内で使用 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | パラメータエラー | @OutputType='NONE'で出力先未指定 | 出力先パラメータを指定 |
| - | 依存エラー | sp_BlitzWhoが未インストール | sp_BlitzWhoをインストール |

### リトライ仕様

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

### 障害時対応

- sp_BlitzWho未インストール時は警告メッセージを出力して続行

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

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

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | - |
| 目標処理時間 | @Seconds + 数秒のオーバーヘッド |
| メモリ使用量上限 | 環境依存 |

## 排他制御

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

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 開始ログ | 常時 | 'Setting up configuration variables' |
| 進捗ログ | 各ステップ | 処理内容 |
| 終了ログ | 完了時 | 結果サマリー |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| ファイルレイテンシ | @FileLatencyThresholdMS | 結果セットに出力 |
| メモリ許可 | @MemoryGrantThresholdPct | 結果セットに出力 |

## 備考

- バージョン: 8.29（2026年2月3日）
- ライセンス: MIT License
- 特記事項:
  - @SinceStartup=1で起動時からの累積統計を表示
  - @AsOfで過去の保存データを参照可能
  - 自動的にデルタビュー（_Deltas）とカテゴリビュー（_Categories）を作成
