# 画面設計書 6-sp_BlitzIndex 診断結果画面

## 概要

本ドキュメントは、SQL Server First Responder Kitのsp_BlitzIndexストアドプロシージャが@Mode=0（デフォルト）で出力する、インデックス診断結果画面の設計仕様を記載する。

### 本画面の処理概要

sp_BlitzIndex診断結果画面は、データベースのインデックス設計と使用状況を分析し、問題点を優先度付きで表示する画面である。高優先度（Priority 1-100）のアドバイスを提供し、インデックスチューニングの指針を示す。

**業務上の目的・背景**：インデックスはSQL Serverのパフォーマンスに大きな影響を与える。不適切なインデックス設計（重複インデックス、未使用インデックス、欠落インデックス等）は、クエリパフォーマンスの低下やストレージの無駄遣いにつながる。sp_BlitzIndexは、インデックスの設計と使用パターンを分析し、改善が必要な項目を優先度付きで提示する。これにより、DBAは効率的にインデックスチューニングを実施でき、データベースのパフォーマンスを最適化できる。

**画面へのアクセス方法**：SQL Server Management Studio (SSMS)またはAzure Data Studioなどのクエリツールから、`EXEC sp_BlitzIndex`を実行することで結果画面にアクセスする。@Modeパラメータで表示モードを切り替え可能。

**主要な操作・処理内容**：
1. データベースのインデックス情報を収集（sys.indexes、sys.index_columns、sys.dm_db_index_usage_stats等）
2. インデックスの問題パターンを検出（重複、未使用、ヒープ、断片化等）
3. 優先度1-100の緊急性の高い問題をリスト表示
4. 各問題に対してURL、詳細、インデックス定義、使用サマリーを提供
5. @Mode=4を使用すると、全優先度（1-255）の診断を表示

**画面遷移**：
- この画面から遷移できる画面：sp_BlitzIndexサマリー画面（@Mode=1）、sp_BlitzIndex使用詳細画面（@Mode=2）、sp_BlitzIndex欠落インデックス画面（@Mode=3）
- この画面に遷移してくる画面：sp_BlitzCache結果画面（インデックス問題検出時）、sp_Blitz結果画面（インデックス警告時）

**権限による表示制御**：VIEW DATABASE STATE権限または対象データベースへの読み取り権限が必要。sysadminまたはdb_owner権限があれば全機能利用可能。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 4 | sp_BlitzIndex | 主機能 | @Mode=0でインデックスの問題を優先度付きで診断・表示 |

## 画面種別

一覧（インデックス診断結果表示）

## URL/ルーティング

```sql
-- 基本実行（現在のデータベース）
EXEC sp_BlitzIndex;

-- 特定データベースを診断
EXEC sp_BlitzIndex @DatabaseName = 'MyDatabase';

-- 特定テーブルを診断
EXEC sp_BlitzIndex
    @DatabaseName = 'MyDatabase',
    @SchemaName = 'dbo',
    @TableName = 'MyTable';

-- 詳細診断（全優先度表示）
EXEC sp_BlitzIndex @Mode = 4;

-- 全データベースを診断
EXEC sp_BlitzIndex @GetAllDatabases = 1;
```

## 入出力項目

### 入力パラメータ

| パラメータ名 | データ型 | デフォルト値 | 説明 |
|-------------|---------|-------------|------|
| @ObjectName | NVARCHAR(386) | NULL | テーブル名（dbname.schema.table形式可） |
| @DatabaseName | NVARCHAR(128) | NULL | データベース名（デフォルト: 現在のDB） |
| @SchemaName | NVARCHAR(128) | NULL | スキーマ名 |
| @TableName | NVARCHAR(261) | NULL | テーブル名 |
| @Mode | TINYINT | 0 | モード（0:診断/1:サマリー/2:使用詳細/3:欠落/4:詳細診断） |
| @Filter | TINYINT | 0 | フィルタ（0:なし/1:読取0除外/2:500MB以上のみ） |
| @SkipPartitions | BIT | 0 | パーティション情報をスキップ |
| @SkipStatistics | BIT | 1 | 統計情報をスキップ |
| @GetAllDatabases | BIT | 0 | 全データベースを診断 |
| @ShowColumnstoreOnly | BIT | 0 | Columnstoreのみ表示 |
| @BringThePain | BIT | 0 | 大量データ処理許可 |
| @IgnoreDatabases | NVARCHAR(MAX) | NULL | 除外するデータベース（カンマ区切り） |
| @ThresholdMB | INT | 250 | 基本結果に含める最小サイズ（MB） |
| @OutputType | VARCHAR(20) | 'TABLE' | 出力形式 |
| @IncludeInactiveIndexes | BIT | 0 | 読み書きのないインデックスも含める |
| @ShowAllMissingIndexRequests | BIT | 0 | 全欠落インデックス要求を表示 |
| @SortOrder | NVARCHAR(50) | NULL | ソート順（@Mode=2のみ） |
| @Help | TINYINT | 0 | ヘルプ表示 |
| @Debug | BIT | 0 | デバッグモード |

## 表示項目

### 結果セット

| 列名 | データ型 | 説明 |
|-----|---------|------|
| Priority | INT | 優先度（1が最も緊急） |
| findings_group | NVARCHAR(4000) | 問題カテゴリ |
| finding | NVARCHAR(200) | 問題名 |
| database_name | NVARCHAR(128) | データベース名 |
| URL | NVARCHAR(200) | 詳細情報へのリンク |
| details | NVARCHAR(MAX) | 問題の詳細説明 |
| index_definition | NVARCHAR(MAX) | インデックス定義 |
| secret_columns | NVARCHAR(MAX) | 含まれる隠しカラム |
| index_usage_summary | NVARCHAR(MAX) | インデックス使用サマリー |
| index_size_summary | NVARCHAR(MAX) | インデックスサイズサマリー |
| create_tsql | NVARCHAR(MAX) | インデックス作成T-SQL |
| more_info | NVARCHAR(MAX) | 追加情報取得コマンド |

### 主要な問題カテゴリ（findings_group）

| findings_group | 説明 |
|---------------|------|
| Multiple Index Personalities | 重複またはほぼ重複のインデックス |
| Index Hoarder | 過剰なインデックス数 |
| Self Loathing Indexes | 未使用または低使用インデックス |
| Workaholics | 書き込み過多のインデックス |
| Feature-Phobic Indexes | 最適化されていないインデックス |
| Abnormal Psychology | 異常な設計パターン |
| Functioning Indexes | 正常に機能しているインデックス |

### 主要な問題項目（finding）

| finding | 説明 | 優先度目安 |
|---------|------|-----------|
| Duplicate Keys | キーが完全に重複 | 1 |
| Borderline Duplicate Keys | ほぼ重複のキー | 10 |
| Unused Index | 未使用インデックス | 10-50 |
| Heap | クラスター化インデックスなし | 50-100 |
| Forwarded Records | 転送レコードあり | 50 |
| Low Fill Factor | 低いフィルファクター | 100 |
| Disabled Index | 無効化されたインデックス | 10 |
| Hypothetical Index | 仮想インデックス | 10 |
| High Write/Low Read | 書き込み多・読み取り少 | 50 |
| Missing Foreign Key Index | 外部キーインデックス欠落 | 50 |

## イベント仕様

### 1-プロシージャ実行（@Mode=0）

ユーザーがsp_BlitzIndexを@Mode=0（デフォルト）で実行すると、以下の処理フローが実行される：

1. パラメータの検証とデフォルト値の設定
2. 対象データベースの特定
3. インデックス情報の収集（#IndexSanity、#IndexSanitySize等）
4. インデックス使用統計の取得
5. 問題パターンの検出とスコアリング
6. Priority 1-100の結果をフィルタして返却

### 2-@Modeパラメータによる動作切替

| @Mode | 表示画面 | 説明 |
|-------|---------|------|
| 0 | 診断結果画面 | 高優先度（1-100）のアドバイス |
| 1 | サマリー画面 | データベースごとの統計概要 |
| 2 | 使用詳細画面 | 既存インデックスの使用統計 |
| 3 | 欠落インデックス画面 | SQL Server提案のインデックス |
| 4 | 診断詳細画面 | 全優先度（1-255）のアドバイス |

### 3-@Filterパラメータ

| @Filter | 動作 |
|--------|------|
| 0 | フィルタなし（デフォルト） |
| 1 | 読み取り0のオブジェクトに対する低使用警告を除外 |
| 2 | 500MB以上のオブジェクトのみ警告 |

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| プロシージャ実行 | #IndexSanity | INSERT | インデックス基本情報を格納 |
| プロシージャ実行 | #IndexSanitySize | INSERT | インデックスサイズ情報を格納 |
| プロシージャ実行 | #IndexColumns | INSERT | インデックス列情報を格納 |
| プロシージャ実行 | #MissingIndexes | INSERT | 欠落インデックス情報を格納 |
| プロシージャ実行 | #BlitzIndexResults | INSERT | 診断結果を格納 |
| 出力テーブル指定時 | @OutputTableName | INSERT | 結果を永続テーブルに保存 |

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

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

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| INSERT | database_id | DB_ID() | 対象データベース |
| INSERT | object_id | sys.indexesから | テーブル/ビューのID |
| INSERT | index_id | sys.indexesから | インデックスID |
| INSERT | index_name | sys.indexesから | インデックス名 |
| INSERT | is_unique | sys.indexesから | 一意性フラグ |
| INSERT | is_primary_key | sys.indexesから | 主キーフラグ |
| INSERT | user_seeks | dm_db_index_usage_statsから | シーク回数 |
| INSERT | user_scans | dm_db_index_usage_statsから | スキャン回数 |
| INSERT | user_lookups | dm_db_index_usage_statsから | ルックアップ回数 |
| INSERT | user_updates | dm_db_index_usage_statsから | 更新回数 |

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 発生条件 |
|-------------|------|---------------|---------|
| - | 情報 | Starting run. {ScriptVersionName} | 処理開始時 |
| - | エラー | Invalid value for parameter @OutputType. Expected: (TABLE;NONE) | 不正な@OutputType |
| - | エラー | Invalid value for parameter @UsualStatisticsSamplingPercent | 不正な@UsualStatisticsSamplingPercent |

## 例外処理

| 例外状況 | 動作 |
|---------|------|
| データベースが存在しない | エラーメッセージを表示 |
| 対象テーブルが存在しない | 空の結果セットを返却 |
| Azure SQL DB | @DatabaseNameがNULLの場合、現在のDBを使用 |
| 権限不足 | アクセス可能な範囲で分析を実行 |

## 備考

- バージョン: 8.29（2026年2月3日）
- ライセンス: MIT License
- 既知の制限事項：
  - SQL Server 2008以降のみ対応
  - インデックス作成文は概略であり、全オプションは含まない
  - 圧縮やファイルグループの構文は複雑なため省略される場合あり

---

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

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

### 推奨読解順序

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

まず、インデックス情報を格納する一時テーブル構造を理解することが重要である。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | sp_BlitzIndex.sql | `sp_BlitzIndex.sql` | 行366-384: #BlitzIndexResultsテーブル定義 |
| 1-2 | sp_BlitzIndex.sql | `sp_BlitzIndex.sql` | 行386-500: #IndexSanityテーブル定義（主要な一時テーブル） |

**読解のコツ**: #IndexSanityには計算列（AS句）が多数定義されており、index_definition、index_usage_summary等の出力形式を理解できる。

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

プロシージャのシグネチャとパラメータ処理を特定する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | sp_BlitzIndex.sql | `sp_BlitzIndex.sql` | 行15-47: ALTER PROCEDUREとパラメータ定義 |
| 2-2 | sp_BlitzIndex.sql | `sp_BlitzIndex.sql` | 行53-59: バージョン情報とVersionCheckMode処理 |
| 2-3 | sp_BlitzIndex.sql | `sp_BlitzIndex.sql` | 行61-111: @Help処理 |

**主要処理フロー**:
1. **行53**: バージョン設定 `@Version = '8.29', @VersionDate = '20260203'`
2. **行20**: @Modeデフォルト値 0（診断モード）
3. **行139-162**: @ObjectNameのパース処理

#### Step 3: @Mode処理を理解する

各モードに応じた処理分岐を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | sp_BlitzIndex.sql | `sp_BlitzIndex.sql` | @Mode判定と分岐処理部分 |

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

```
sp_BlitzIndex
    │
    ├─ パラメータ検証・初期化
    │      ├─ バージョンチェック
    │      ├─ @Help処理
    │      └─ @ObjectNameパース
    │
    ├─ 一時テーブル作成
    │      ├─ #BlitzIndexResults
    │      ├─ #IndexSanity
    │      ├─ #IndexSanitySize
    │      ├─ #IndexColumns
    │      └─ #MissingIndexes
    │
    ├─ インデックス情報収集
    │      ├─ sys.indexes
    │      ├─ sys.index_columns
    │      ├─ sys.dm_db_index_usage_stats
    │      └─ sys.dm_db_index_physical_stats
    │
    ├─ 問題検出・スコアリング
    │      ├─ 重複インデックス検出
    │      ├─ 未使用インデックス検出
    │      ├─ ヒープテーブル検出
    │      └─ その他問題パターン
    │
    └─ 結果出力（@Mode別）
           ├─ Mode 0: 診断結果（Priority 1-100）
           ├─ Mode 1: サマリー
           ├─ Mode 2: 使用詳細
           ├─ Mode 3: 欠落インデックス
           └─ Mode 4: 診断詳細（全Priority）
```

### データフロー図

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

@パラメータ群 ───────▶ sp_BlitzIndex ─────────────────▶ 結果セット
                           │
                           ▼
    sys.indexes ─────────▶ #IndexSanity ───────────▶ Priority順
    sys.index_columns        │                         リスト表示
    sys.dm_db_index_usage_stats
    sys.dm_db_index_physical_stats
                           │
                           ▼
                    #BlitzIndexResults
```

### 関連ファイル一覧

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