# 画面設計書 9-sp_BlitzIndex 欠落インデックス画面

## 概要

本ドキュメントは、SQL Server First Responder Kitのsp_BlitzIndexストアドプロシージャを@Mode=3で実行した際に出力される、欠落インデックス画面の設計仕様を記載する。

### 本画面の処理概要

sp_BlitzIndex欠落インデックス画面は、SQL Serverが提案する欠落インデックスの一覧を表示する画面である。クエリオプティマイザが検出した「このインデックスがあればパフォーマンスが向上する」という提案を整理して表示する。

**業務上の目的・背景**：SQL Serverのクエリオプティマイザは、クエリ実行時に「このインデックスがあればより効率的に実行できる」という情報をsys.dm_db_missing_index_*DMVに記録する。@Mode=3の欠落インデックス画面は、これらの提案を分析し、インパクトの大きい順にソートして表示する。DBAはこの情報を基に、追加すべきインデックスの優先順位を決定できる。ただし、すべての提案を盲目的に適用するのではなく、既存インデックスとの重複やオーバーヘッドを考慮して判断する必要がある。

**画面へのアクセス方法**：`EXEC sp_BlitzIndex @Mode = 3`を実行することで欠落インデックス画面にアクセスする。

**主要な操作・処理内容**：
1. sys.dm_db_missing_index_groups、sys.dm_db_missing_index_group_stats、sys.dm_db_missing_index_detailsから欠落インデックス情報を取得
2. インパクト（改善度 x 使用回数）に基づきスコアリング
3. 提案されるインデックス定義（キー列、付加列）を整形
4. 作成用T-SQLスクリプトを生成
5. インパクト順にソートして表示

**画面遷移**：
- この画面から遷移できる画面：sp_BlitzIndex診断結果画面（@Mode=0）
- この画面に遷移してくる画面：sp_BlitzIndex診断結果画面（@Mode=3指定時）

**権限による表示制御**：sp_BlitzIndex診断結果画面と同じ権限要件。VIEW SERVER STATE権限があれば全欠落インデックス情報にアクセス可能。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 4 | sp_BlitzIndex | 主機能 | @Mode=3でSQL Serverが提案する欠落インデックスの一覧を表示 |

## 画面種別

一覧（欠落インデックス提案表示）

## URL/ルーティング

```sql
-- 欠落インデックス表示
EXEC sp_BlitzIndex @Mode = 3;

-- 特定データベースの欠落インデックス
EXEC sp_BlitzIndex @Mode = 3, @DatabaseName = 'MyDatabase';

-- 全欠落インデックス要求を表示
EXEC sp_BlitzIndex @Mode = 3, @ShowAllMissingIndexRequests = 1;
```

## 入出力項目

### 入力パラメータ

sp_BlitzIndex共通のパラメータを使用。@Mode = 3を指定する。

| パラメータ名 | データ型 | デフォルト値 | 説明 |
|-------------|---------|-------------|------|
| @Mode | TINYINT | 0 | 3を指定で欠落インデックスモード |
| @DatabaseName | NVARCHAR(128) | NULL | 対象データベース |
| @ShowAllMissingIndexRequests | BIT | 0 | 1=全要求を表示 |

## 表示項目

### 結果セット

| 列名 | データ型 | 説明 |
|-----|---------|------|
| database_name | NVARCHAR(128) | データベース名 |
| schema_name | NVARCHAR(128) | スキーマ名 |
| table_name | NVARCHAR(128) | テーブル名 |
| index_advantage | DECIMAL | インデックスの優位性スコア |
| avg_user_impact | DECIMAL | 平均ユーザーインパクト（%） |
| user_seeks | BIGINT | 提案シーク回数 |
| user_scans | BIGINT | 提案スキャン回数 |
| unique_compiles | BIGINT | ユニークコンパイル数 |
| equality_columns | NVARCHAR(MAX) | 等価条件で使用される列 |
| inequality_columns | NVARCHAR(MAX) | 不等価条件で使用される列 |
| included_columns | NVARCHAR(MAX) | 付加列として提案される列 |
| create_tsql | NVARCHAR(MAX) | インデックス作成用T-SQL |
| more_info | NVARCHAR(MAX) | 追加情報取得コマンド |

### インデックス優位性スコアの計算

```
index_advantage = avg_user_impact * (user_seeks + user_scans)
```

- avg_user_impact: このインデックスによるコスト削減率（%）
- user_seeks + user_scans: このインデックスが使用される推定回数

## イベント仕様

### 1-欠落インデックス情報取得

@Mode=3で実行した場合、以下の処理が実行される：

1. sys.dm_db_missing_index_groupsからグループ情報を取得
2. sys.dm_db_missing_index_group_statsから統計情報を取得
3. sys.dm_db_missing_index_detailsから詳細情報を取得
4. スコアを計算しソート
5. 作成用T-SQLを生成
6. 結果を返却

### 2-欠落インデックスDMV

| DMV | 説明 |
|-----|------|
| sys.dm_db_missing_index_details | 欠落インデックスの列情報 |
| sys.dm_db_missing_index_groups | インデックスグループ情報 |
| sys.dm_db_missing_index_group_stats | グループの使用統計 |
| sys.dm_db_missing_index_columns | 列の詳細情報 |

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| プロシージャ実行 | #MissingIndexes | INSERT | 欠落インデックス情報を一時格納 |

## メッセージ仕様

sp_BlitzIndex共通のメッセージを参照。

## 例外処理

| 例外状況 | 動作 |
|---------|------|
| 欠落インデックス情報なし | 空の結果セットを返却 |
| DMVへのアクセス権限なし | エラーまたは空結果 |

## 備考

- 欠落インデックス情報はSQL Server再起動でリセットされる
- すべての提案を適用するのではなく、既存インデックスとの重複を確認
- 提案されたインデックスを追加すると書き込みオーバーヘッドが増加する可能性あり
- @ShowAllMissingIndexRequests=1で通常フィルタされる低インパクト要求も表示

---

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

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

### 推奨読解順序

#### Step 1: @Mode=3の処理分岐を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | sp_BlitzIndex.sql | `sp_BlitzIndex.sql` | @Mode判定と分岐処理部分 |
| 1-2 | sp_BlitzIndex.sql | `sp_BlitzIndex.sql` | #MissingIndexesテーブル定義 |

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

```
sp_BlitzIndex (@Mode = 3)
    │
    ├─ 欠落インデックス情報取得
    │      ├─ sys.dm_db_missing_index_groups
    │      ├─ sys.dm_db_missing_index_group_stats
    │      └─ sys.dm_db_missing_index_details
    │
    ├─ スコア計算・ソート
    │      └─ index_advantage計算
    │
    └─ 結果出力
           └─ create_tsql生成
```

### データフロー図

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

sys.dm_db_missing_index_* ──▶ sp_BlitzIndex ─────────▶ 欠落インデックス
                                   │                      一覧
                                   ▼
                            #MissingIndexes
                                   │
                                   ▼
                            スコア計算 → ソート
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| sp_BlitzIndex.sql | `sp_BlitzIndex.sql` | ソース | メインプロシージャ定義 |
