# 画面設計書 12-sp_BlitzAnalysis結果画面

## 概要

本ドキュメントは、SQL Server First Responder Kitのsp_BlitzAnalysisストアドプロシージャが出力する結果画面の設計書です。sp_BlitzAnalysisはsp_BlitzFirstの出力テーブルに記録されたデータを分析・表示し、過去のパフォーマンスデータを検索・分析するための画面を提供します。

### 本画面の処理概要

sp_BlitzAnalysis結果画面は、過去にsp_BlitzFirstやsp_BlitzCache、sp_BlitzWhoで収集され、テーブルに保存されたパフォーマンスデータを横断的に分析・表示する画面です。複数のデータソース（BlitzFirst、WaitStats、FileStats、PerfmonStats、BlitzCache、BlitzWho）から指定期間のデータを抽出し、パフォーマンス問題の傾向分析を可能にします。

**業務上の目的・背景**：SQL Serverの定期的なパフォーマンス監視では、sp_BlitzFirstをスケジュール実行してデータをテーブルに蓄積します。sp_BlitzAnalysisはその蓄積データを分析し、「昨日の夜間バッチで何が起きていたか」「先週の同じ時間帯と比較して何が変わったか」といった過去のパフォーマンス問題を調査するために使用されます。障害後の事後分析やパフォーマンストレンド把握に不可欠なツールです。

**画面へのアクセス方法**：SQL Server Management Studio（SSMS）またはAzure Data Studio等のクエリツールから、以下のようにストアドプロシージャを実行します。
- 基本実行: `EXEC sp_BlitzAnalysis @OutputDatabaseName = 'DBAtools', @StartDate = '2026-02-18 00:00:00';`
- 期間指定: `EXEC sp_BlitzAnalysis @StartDate = '2026-02-18 00:00:00', @EndDate = '2026-02-18 12:00:00';`

**主要な操作・処理内容**：
1. パラメータの検証とデフォルト値設定
2. 出力テーブル名のフルパス構築
3. BlitzFirstテーブルからの問題検出履歴取得
4. WaitStatsデルタテーブルからの待機統計取得（Top N）
5. FileStatsデルタテーブルからのI/O統計取得
6. PerfmonStats実測値テーブルからのパフォーマンスカウンター取得
7. BlitzCacheテーブルからのクエリキャッシュ分析データ取得
8. BlitzWhoデルタテーブルからの実行中クエリ履歴取得

**画面遷移**：
- sp_BlitzFirst（テーブル出力モード）でデータを蓄積後に使用
- sp_BlitzCache（テーブル出力モード）のデータも分析可能
- sp_BlitzWho（テーブル出力モード）のデータも分析可能
- 単独の分析ツールとして実行

**権限による表示制御**：
- 出力テーブルが格納されているデータベースへのSELECT権限が必要
- テーブルが存在しない場合はスキップされ、警告メッセージが表示される

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 7 | sp_BlitzAnalysis | 主機能 | sp_BlitzFirstの出力テーブルに記録されたデータを分析・表示 |
| 3 | sp_BlitzFirst | API連携 | BlitzFirstテーブルから過去のパフォーマンスデータを取得 |
| 2 | sp_BlitzCache | API連携 | BlitzCacheテーブルから過去のクエリキャッシュ分析データを取得 |
| 6 | sp_BlitzWho | API連携 | BlitzWhoテーブルから過去の実行中クエリ情報を取得 |

## 画面種別

一覧 / 履歴分析

## URL/ルーティング

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

## 入出力項目

### 入力パラメータ

| パラメータ名 | データ型 | デフォルト値 | 説明 |
|-------------|---------|-------------|------|
| @Help | TINYINT | 0 | 1を指定するとヘルプを表示 |
| @StartDate | DATETIMEOFFSET(7) | NULL | 分析開始日時（NULLの場合は1時間前） |
| @EndDate | DATETIMEOFFSET(7) | NULL | 分析終了日時（NULLの場合は@StartDateから1時間後） |
| @OutputDatabaseName | NVARCHAR(256) | 'DBAtools' | データ格納先データベース名 |
| @OutputSchemaName | NVARCHAR(256) | 'dbo' | データ格納先スキーマ名 |
| @OutputTableNameBlitzFirst | NVARCHAR(256) | 'BlitzFirst' | BlitzFirstテーブル名 |
| @OutputTableNameFileStats | NVARCHAR(256) | 'BlitzFirst_FileStats' | FileStatsテーブル名 |
| @OutputTableNamePerfmonStats | NVARCHAR(256) | 'BlitzFirst_PerfmonStats' | PerfmonStatsテーブル名 |
| @OutputTableNameWaitStats | NVARCHAR(256) | 'BlitzFirst_WaitStats' | WaitStatsテーブル名 |
| @OutputTableNameBlitzCache | NVARCHAR(256) | 'BlitzCache' | BlitzCacheテーブル名 |
| @OutputTableNameBlitzWho | NVARCHAR(256) | 'BlitzWho' | BlitzWhoテーブル名 |
| @Servername | NVARCHAR(128) | @@SERVERNAME | 分析対象サーバー名 |
| @Databasename | NVARCHAR(128) | NULL | データベース名フィルタ |
| @BlitzCacheSortorder | NVARCHAR(20) | 'cpu' | BlitzCacheソート順 |
| @MaxBlitzFirstPriority | INT | 249 | BlitzFirst最大優先度 |
| @ReadLatencyThreshold | INT | 100 | 読み取りレイテンシ閾値(ms) |
| @WriteLatencyThreshold | INT | 100 | 書き込みレイテンシ閾値(ms) |
| @WaitStatsTop | TINYINT | 10 | 待機統計Top件数 |
| @BringThePain | BIT | 0 | 4時間以上のデータ取得許可 |
| @Maxdop | INT | 1 | 並列度設定 |
| @Debug | BIT | 0 | デバッグSQL出力 |

## 表示項目

### 結果セット1: レポート情報

| 項目名 | データ型 | 説明 |
|--------|---------|------|
| ServerToReportOn | NVARCHAR(128) | 分析対象サーバー名 |
| PrioritesToInclude | NVARCHAR(40) | 含まれる優先度範囲 |
| StartDatetime | DATETIMEOFFSET(7) | 分析開始日時 |
| EndDatetime | DATETIMEOFFSET(7) | 分析終了日時 |

### 結果セット2: BlitzFirst問題サマリー

| 項目名 | データ型 | 説明 |
|--------|---------|------|
| Priority | TINYINT | 優先度 |
| FindingsGroup | VARCHAR(50) | 問題グループ |
| Finding | VARCHAR(200) | 問題内容 |
| TotalOccurrences | INT | 発生回数 |
| FirstOccurrence | DATETIMEOFFSET(7) | 初回発生日時 |
| LastOccurrence | DATETIMEOFFSET(7) | 最終発生日時 |

### 結果セット3: BlitzFirst詳細

| 項目名 | データ型 | 説明 |
|--------|---------|------|
| ServerName | NVARCHAR(128) | サーバー名 |
| CheckDate | DATETIMEOFFSET | チェック日時 |
| CheckID | INT | チェックID |
| Priority | INT | 優先度 |
| Finding | VARCHAR(200) | 問題内容 |
| URL | VARCHAR(200) | 参考URL |
| Details | NVARCHAR(MAX) | 詳細情報 |
| HowToStopIt | NVARCHAR(MAX) | 対処方法 |
| QueryPlan | XML | クエリプラン |
| QueryText | NVARCHAR(MAX) | クエリテキスト |

### 結果セット4: 待機統計

| 項目名 | データ型 | 説明 |
|--------|---------|------|
| ServerName | NVARCHAR(128) | サーバー名 |
| CheckDate | DATETIMEOFFSET | チェック日時 |
| wait_type | NVARCHAR(60) | 待機タイプ |
| WaitsRank | BIGINT | 待機ランク |
| WaitCategory | NVARCHAR(128) | 待機カテゴリ |
| Ignorable | BIT | 無視可能フラグ |
| ElapsedSeconds | INT | 経過秒数 |
| wait_time_ms_delta | BIGINT | 待機時間(ms)差分 |
| wait_time_minutes_delta | DECIMAL | 待機時間(分)差分 |
| wait_time_minutes_per_minute | DECIMAL | 分あたり待機時間(分) |
| signal_wait_time_ms_delta | BIGINT | シグナル待機時間(ms)差分 |
| waiting_tasks_count_delta | BIGINT | 待機タスク数差分 |
| wait_time_ms_per_wait | DECIMAL | 待機あたり待機時間(ms) |

### 結果セット5: ファイル統計

| 項目名 | データ型 | 説明 |
|--------|---------|------|
| ServerName | NVARCHAR(128) | サーバー名 |
| CheckDate | DATETIMEOFFSET | チェック日時 |
| io_stall_ms_breached | VARCHAR(3) | 閾値超過フラグ |
| PhysicalPath | NVARCHAR(260) | 物理パス |
| SizeOnDiskMB | DECIMAL | ディスクサイズ(MB) |
| SizeOnDiskMBgrowth | DECIMAL | サイズ増加量(MB) |
| max_io_stall_read_ms | BIGINT | 最大読み取り遅延(ms) |
| max_io_stall_read_ms_average | BIGINT | 平均読み取り遅延(ms) |
| num_of_reads | BIGINT | 読み取り回数 |
| megabytes_read | DECIMAL | 読み取り量(MB) |
| max_io_stall_write_ms | BIGINT | 最大書き込み遅延(ms) |
| max_io_stall_write_ms_average | BIGINT | 平均書き込み遅延(ms) |
| num_of_writes | BIGINT | 書き込み回数 |
| megabytes_written | DECIMAL | 書き込み量(MB) |

### 結果セット6: Perfmon統計

| 項目名 | データ型 | 説明 |
|--------|---------|------|
| ServerName | NVARCHAR(128) | サーバー名 |
| CheckDate | DATETIMEOFFSET | チェック日時 |
| counter_name | NVARCHAR(128) | カウンター名 |
| object_name | NVARCHAR(128) | オブジェクト名 |
| instance_name | NVARCHAR(128) | インスタンス名 |
| cntr_value | BIGINT | カウンター値 |

### 結果セット7: BlitzCacheデータ

| 項目名 | データ型 | 説明 |
|--------|---------|------|
| ServerName | NVARCHAR(128) | サーバー名 |
| CheckDate | DATETIMEOFFSET | チェック日時 |
| Sortorder | NVARCHAR(20) | ソート順 |
| TimeFrameRank | INT | 時間枠内ランク |
| OverallRank | INT | 全体ランク |
| QueryType | NVARCHAR(256) | クエリタイプ |
| QueryText | NVARCHAR(MAX) | クエリテキスト |
| DatabaseName | NVARCHAR(128) | データベース名 |
| AverageCPU | BIGINT | 平均CPU |
| TotalCPU | BIGINT | 総CPU |
| AverageDuration | BIGINT | 平均実行時間 |
| TotalDuration | BIGINT | 総実行時間 |
| AverageReads | BIGINT | 平均読み取り |
| TotalReads | BIGINT | 総読み取り |
| ExecutionCount | BIGINT | 実行回数 |
| QueryPlan | XML | クエリプラン |

### 結果セット8: BlitzWhoデータ

| 項目名 | データ型 | 説明 |
|--------|---------|------|
| ServerName | NVARCHAR(128) | サーバー名 |
| CheckDate | DATETIMEOFFSET | チェック日時 |
| elapsed_time | VARCHAR(41) | 経過時間 |
| session_id | SMALLINT | セッションID |
| database_name | NVARCHAR(128) | データベース名 |
| query_text_snippet | NVARCHAR(1000) | クエリテキスト（抜粋） |
| query_plan | XML | 実行プラン |
| live_query_plan | XML | ライブクエリプラン |
| status | NVARCHAR(30) | ステータス |
| wait_info | NVARCHAR(MAX) | 待機情報 |
| blocking_session_id | SMALLINT | ブロッキング元セッションID |

## イベント仕様

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

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

1. バージョンチェック（@VersionCheckMode=1時は即リターン）
2. @Help=1の場合はヘルプテキストを表示して終了
3. @OutputDatabaseNameの存在確認（存在しない場合はエラー）
4. @BlitzCacheSortorderの検証（無効な場合はエラー）
5. @StartDate/@EndDateのデフォルト値設定
6. @BringThePain検証（4時間以上かつall指定時は確認要求）
7. 各テーブルからのデータ取得と結果セット返却

### 2-データ取得フロー

1. レポート情報の出力
2. BlitzFirst問題サマリー取得（GROUP BY Priority, FindingsGroup, Finding）
3. BlitzFirst詳細取得（チェック日時順）
4. WaitStatsデルタ取得（Top N per CheckDate）
5. FileStatsデルタ取得（物理パス別集計）
6. PerfmonStats取得
7. BlitzCacheデータ取得（CTE + CROSS APPLYでTop 5 per CheckDate per SortOrder）
8. BlitzWhoデルタ取得

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| プロシージャ実行 | なし | SELECT | 全てSELECT専用。更新操作なし |

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

このプロシージャはSELECT専用であり、データベースの更新は行いません。

## メッセージ仕様

| メッセージ種別 | メッセージ | 発生条件 |
|--------------|----------|---------|
| エラー | Invalid database name provided for parameter @OutputDatabaseName: {name} | @OutputDatabaseNameで指定されたDBが存在しない |
| エラー | Invalid sort option specified for @BlitzCacheSortorder | 無効なソートオプション指定時 |
| 警告 | Setting @StartDate to: 1 hour ago | @StartDateがNULLの場合 |
| 警告 | Setting @EndDate to: Now | @EndDateがNULLで@StartDateもNULLの場合 |
| 警告 | @EndDate was NULL - Setting to return 1 hour of information | @EndDateがNULLの場合 |
| 警告 | Wow! hold up now, are you sure you wanna do this? | 4時間以上+@BlitzCacheSortorder='all'+@BringThePain=0 |
| 情報 | Getting BlitzFirst info from {table} | BlitzFirst取得開始 |
| 情報 | Getting wait stats info from {table} | WaitStats取得開始 |
| 情報 | Getting FileStats info from {table} | FileStats取得開始 |
| 情報 | Getting Perfmon info from {table} | Perfmon取得開始 |
| 情報 | Sortorder for BlitzCache data: {sortorder} | BlitzCache取得開始 |
| 情報 | Getting BlitzCache info from {table} | BlitzCache取得実行 |
| 情報 | Getting BlitzWho info from {table} | BlitzWho取得開始 |
| スキップ | Skipped logged {type} data as NULL was passed to parameter | テーブル名がNULLの場合 |
| スキップ | No {type} data available as the table cannot be found | テーブルが存在しない場合 |
| 結果 | No findings with a priority between 1 and {max} found for this period | BlitzFirst結果が0件の場合 |

## 例外処理

| 状態 | 説明 | 対応 |
|------|------|------|
| 出力データベースが存在しない | @OutputDatabaseNameで指定されたDBが見つからない | エラーメッセージ出力後、RETURN |
| テーブルが存在しない | 各出力テーブルが見つからない | 警告メッセージ出力、該当結果セットはスキップ |
| 無効なソートオプション | @BlitzCacheSortorderに無効な値 | エラーメッセージ出力後、RETURN |
| 大量データ取得リスク | 4時間以上+all+BringThePain=0 | エラーメッセージ出力後、RETURN |

## 備考

- @BlitzCacheSortorderの有効値: 'all', 'cpu', 'reads', 'writes', 'duration', 'executions', 'memory grant', 'spills'
- テーブル名にはサフィックスが自動付加される（例: _Deltas, _Actuals）
- memory grant、spillsソートはSQL Server 2016以降でのみサポート
- バージョン: 8.29（2026年2月3日時点）

---

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

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

### 推奨読解順序

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

sp_BlitzAnalysisは複数のテーブルから読み取りを行います。各テーブルのスキーマはsp_BlitzFirst等で定義されています。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | sp_BlitzAnalysis.sql | `sp_BlitzAnalysis.sql` | 行77-82: ローカル変数宣言（テーブル名フルパス用） |
| 1-2 | sp_BlitzAnalysis.sql | `sp_BlitzAnalysis.sql` | 行95-101: フルパステーブル名の構築（Quotename使用） |
| 1-3 | sp_BlitzAnalysis.sql | `sp_BlitzAnalysis.sql` | 行103-115: #BlitzFirstCounts一時テーブル定義 |

**読解のコツ**: テーブル名にはサフィックスが自動付加されます（例: BlitzFirst_FileStats -> BlitzFirst_FileStats_Deltas）。これはsp_BlitzFirst側で作成されるビュー名と対応しています。

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

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

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

**主要処理フロー**:
1. **行40**: バージョン情報設定 `@Version = '8.29', @VersionDate = '20260203'`
2. **行42-45**: VersionCheckModeの場合は即RETURN
3. **行47-74**: ヘルプテキスト出力処理（実行例含む）

#### Step 3: パラメータ検証を理解する

入力パラメータの検証とデフォルト値設定を行う部分です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | sp_BlitzAnalysis.sql | `sp_BlitzAnalysis.sql` | 行88-93: @OutputDatabaseNameの存在確認 |
| 3-2 | sp_BlitzAnalysis.sql | `sp_BlitzAnalysis.sql` | 行117-129: @BlitzCacheSortorderの検証 |
| 3-3 | sp_BlitzAnalysis.sql | `sp_BlitzAnalysis.sql` | 行131-141: @Maxdopの検証と調整 |
| 3-4 | sp_BlitzAnalysis.sql | `sp_BlitzAnalysis.sql` | 行143-154: memory grant/spills対応チェック |
| 3-5 | sp_BlitzAnalysis.sql | `sp_BlitzAnalysis.sql` | 行157-184: @StartDate/@EndDateのデフォルト値設定 |
| 3-6 | sp_BlitzAnalysis.sql | `sp_BlitzAnalysis.sql` | 行192-197: @BringThePain検証 |

**主要処理フロー**:
- **行88-93**: DB_IDでデータベース存在確認
- **行125-129**: 有効なソートオプションの列挙
- **行143-154**: sys.dm_exec_query_statsのカラム存在確認
- **行157-168**: @StartDateがNULLなら1時間前に設定
- **行192-197**: 4時間以上+all+BringThePain=0でエラー

#### Step 4: BlitzFirst取得処理を理解する

BlitzFirstテーブルからの問題検出履歴取得です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | sp_BlitzAnalysis.sql | `sp_BlitzAnalysis.sql` | 行207-257: BlitzFirst取得SQL構築 |
| 4-2 | sp_BlitzAnalysis.sql | `sp_BlitzAnalysis.sql` | 行267-292: 実行とエラーハンドリング |

**主要処理フロー**:
- **行209-222**: #BlitzFirstCountsへのINSERT（GROUP BY集計）
- **行224-234**: サマリー結果のSELECT
- **行240-256**: 詳細結果のSELECT
- **行267-278**: テーブル存在確認とスキップ処理

#### Step 5: WaitStats取得処理を理解する

待機統計デルタテーブルからの取得です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 5-1 | sp_BlitzAnalysis.sql | `sp_BlitzAnalysis.sql` | 行294-332: WaitStats取得SQL構築 |

**主要処理フロー**:
- **行295-332**: ROW_NUMBER OVER (PARTITION BY CheckDate)でTop N取得
- **行308**: wait_time_ms_per_waitの計算

#### Step 6: FileStats/Perfmon取得処理を理解する

ファイル統計とパフォーマンスカウンターの取得です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 6-1 | sp_BlitzAnalysis.sql | `sp_BlitzAnalysis.sql` | 行367-405: FileStats取得SQL構築 |
| 6-2 | sp_BlitzAnalysis.sql | `sp_BlitzAnalysis.sql` | 行444-459: Perfmon取得SQL構築 |

**主要処理フロー**:
- **行373-377**: io_stall_ms_breached判定（閾値超過チェック）
- **行378**: 物理パスの抽出（ファイル名除去）
- **行399-402**: PhysicalPath別GROUP BY

#### Step 7: BlitzCache取得処理を理解する

BlitzCacheテーブルからのクエリキャッシュ分析データ取得です。複雑なCTE構造を持ちます。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 7-1 | sp_BlitzAnalysis.sql | `sp_BlitzAnalysis.sql` | 行492-509: 基本CTE構築 |
| 7-2 | sp_BlitzAnalysis.sql | `sp_BlitzAnalysis.sql` | 行514-663: ソート別CTE構築（VALUES句使用） |
| 7-3 | sp_BlitzAnalysis.sql | `sp_BlitzAnalysis.sql` | 行668-702: UNION ALLでの結合 |

**主要処理フロー**:
- **行496-509**: CheckDates CTE（対象日時の一覧）
- **行514-663**: 動的CTE生成（TopCPU, TopReads等）
- **行648-656**: VALUES句でソートオプションを定義
- **行668-702**: STUFF + FOR XML PATHでUNION ALL構築

#### Step 8: BlitzWho取得処理を理解する

BlitzWhoデルタテーブルからの実行中クエリ履歴取得です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 8-1 | sp_BlitzAnalysis.sql | `sp_BlitzAnalysis.sql` | 行747-855: BlitzWho取得SQL構築 |

**主要処理フロー**:
- **行845-848**: @Databasenameフィルタ適用

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

```
sp_BlitzAnalysis
    |
    +-- パラメータ検証
    |      |
    |      +-- DB_ID() (データベース存在確認)
    |      +-- sys.dm_exec_query_stats (カラム存在確認)
    |
    +-- [BlitzFirst]テーブル
    |      |
    |      +-- GROUP BY集計 -> #BlitzFirstCounts
    |      +-- 詳細SELECT
    |
    +-- [BlitzFirst_WaitStats_Deltas]ビュー
    |      |
    |      +-- ROW_NUMBER PARTITION BY -> Top N
    |
    +-- [BlitzFirst_FileStats_Deltas]ビュー
    |      |
    |      +-- GROUP BY PhysicalPath
    |
    +-- [BlitzFirst_PerfmonStats_Actuals]ビュー
    |
    +-- [BlitzCache]テーブル
    |      |
    |      +-- CTE: CheckDates
    |      +-- CTE: TopCPU, TopReads, TopWrites, ...
    |      +-- CROSS APPLY TOP 5
    |      +-- UNION ALL
    |
    +-- [BlitzWho_Deltas]ビュー
```

### データフロー図

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

@StartDate, @EndDate    ───▶  パラメータ検証・設定
@OutputDatabaseName                   |
                                      ▼
                               レポート情報出力      ───▶  結果セット1
                                      |
                                      ▼
[BlitzFirst]テーブル    ───▶  GROUP BY集計          ───▶  結果セット2
                        ───▶  詳細SELECT           ───▶  結果セット3
                                      |
                                      ▼
[WaitStats_Deltas]     ───▶  ROW_NUMBER Top N      ───▶  結果セット4
                                      |
                                      ▼
[FileStats_Deltas]     ───▶  PhysicalPath集計      ───▶  結果セット5
                                      |
                                      ▼
[PerfmonStats_Actuals] ───▶  そのまま取得          ───▶  結果セット6
                                      |
                                      ▼
[BlitzCache]           ───▶  CTE + CROSS APPLY     ───▶  結果セット7
                               Top 5 per Sort
                                      |
                                      ▼
[BlitzWho_Deltas]      ───▶  フィルタ付き取得      ───▶  結果セット8
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| sp_BlitzAnalysis.sql | `sp_BlitzAnalysis.sql` | ソース | メインストアドプロシージャ |
| sp_BlitzFirst.sql | `sp_BlitzFirst.sql` | ソース | 分析対象データを生成・蓄積 |
| sp_BlitzCache.sql | `sp_BlitzCache.sql` | ソース | BlitzCacheテーブルのデータ生成元 |
| sp_BlitzWho.sql | `sp_BlitzWho.sql` | ソース | BlitzWhoテーブルのデータ生成元 |
