# バッチ設計書 4-sp_BlitzIndex

## 概要

本ドキュメントは、SQL Server First Responder Kitに含まれるsp_BlitzIndexストアドプロシージャのバッチ設計書です。sp_BlitzIndexはインデックスの設計とパフォーマンスを分析し、問題のあるインデックスや欠落インデックスを検出する診断ツールです。

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

sp_BlitzIndexは、データベースのインデックス構成を包括的に分析し、未使用インデックス、重複インデックス、欠落インデックス、ヒープテーブル、断片化などの問題を検出するストアドプロシージャです。

**業務上の目的・背景**：インデックスはSQL Serverのパフォーマンスに最も大きな影響を与える要素の一つです。しかし、不適切なインデックス設計は、クエリパフォーマンスの低下だけでなく、書き込みオーバーヘッドの増加やストレージの浪費を引き起こします。sp_BlitzIndexは、インデックスの使用状況を分析し、追加すべきインデックス、削除を検討すべきインデックス、改善が必要なインデックスを特定することで、効率的なインデックス管理を支援します。

**バッチの実行タイミング**：随時実行。新しいアプリケーションのデプロイ後、パフォーマンス問題発生時、定期的なインデックスメンテナンスの一環として実行されます。

**主要な処理内容**：
1. データベースのインデックス情報を収集（sys.indexes、sys.index_usage_stats等）
2. インデックスの使用状況分析（読み取り/書き込み比率）
3. 重複インデックスの検出
4. 欠落インデックスの分析（sys.dm_db_missing_index_details）
5. ヒープテーブルの検出
6. 統計情報の分析
7. Columnstoreインデックスの分析
8. 結果の出力と改善提案

**前後の処理との関連**：sp_BlitzCacheで特定されたクエリの改善策としてsp_BlitzIndexを実行し、インデックスの追加や変更を検討することが一般的です。

**影響範囲**：読み取り専用の診断ツールです。大規模データベースでは実行時間が長くなる可能性があります。@ThresholdMBパラメータでフィルタリングすることを推奨します。

## バッチ種別

診断・分析

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時/週次 |
| 実行時刻 | 業務影響の少ない時間帯推奨 |
| 実行曜日 | 該当なし |
| 実行日 | 該当なし |
| トリガー | 手動 |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| SQL Serverバージョン | SQL Server 2008以降 |
| 必要権限 | VIEW DATABASE STATE権限 |
| 依存オブジェクト | なし |

### 実行可否判定

- 対象データベースが存在しオンラインであること
- @GetAllDatabases=1の場合、すべてのオンラインDBを対象

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| @ObjectName | NVARCHAR(386) | No | NULL | 対象オブジェクト名（db.schema.table形式） |
| @DatabaseName | NVARCHAR(128) | No | NULL | 対象データベース名 |
| @SchemaName | NVARCHAR(128) | No | NULL | 対象スキーマ名 |
| @TableName | NVARCHAR(261) | No | NULL | 対象テーブル名 |
| @Mode | TINYINT | No | 0 | モード（0=診断/1=サマリー/2=使用詳細/3=欠落詳細/4=診断詳細） |
| @Filter | TINYINT | No | 0 | フィルタ（0=なし/1=低使用警告除外/2=500MB以上のみ） |
| @SkipPartitions | BIT | No | 0 | パーティション情報をスキップ |
| @SkipStatistics | BIT | No | 1 | 統計情報をスキップ |
| @UsualStatisticsSamplingPercent | FLOAT | No | 100 | 通常の統計サンプリング率 |
| @GetAllDatabases | BIT | No | 0 | 全データベースを対象 |
| @ShowColumnstoreOnly | BIT | No | 0 | Columnstoreのみ表示 |
| @BringThePain | BIT | No | 0 | 詳細分析を有効化 |
| @IgnoreDatabases | NVARCHAR(MAX) | No | NULL | 除外するデータベースリスト |
| @ThresholdMB | INT | No | 250 | 最小オブジェクトサイズ（MB） |
| @OutputType | VARCHAR(20) | No | 'TABLE' | 出力形式 |
| @OutputServerName | NVARCHAR(256) | No | NULL | 出力先サーバー |
| @OutputDatabaseName | NVARCHAR(256) | No | NULL | 出力先データベース |
| @OutputSchemaName | NVARCHAR(256) | No | NULL | 出力先スキーマ |
| @OutputTableName | NVARCHAR(261) | No | NULL | 出力先テーブル |
| @IncludeInactiveIndexes | BIT | No | 0 | 非アクティブインデックスを含む |
| @ShowAllMissingIndexRequests | BIT | No | 0 | 全欠落インデックスリクエストを表示 |
| @ShowPartitionRanges | BIT | No | 0 | パーティション範囲を表示 |
| @SortOrder | NVARCHAR(50) | No | NULL | ソート順（@Mode=2時） |
| @SortDirection | NVARCHAR(4) | No | 'DESC' | ソート方向 |
| @Help | TINYINT | No | 0 | ヘルプ表示 |
| @Debug | BIT | No | 0 | デバッグモード |
| @Version | VARCHAR(30) | No | NULL | バージョン（OUTPUT） |
| @VersionDate | DATETIME | No | NULL | バージョン日付（OUTPUT） |
| @VersionCheckMode | BIT | No | 0 | バージョンチェックモード |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| sys.indexes | システムビュー | インデックス定義 |
| sys.index_usage_stats | DMV | インデックス使用統計 |
| sys.dm_db_index_operational_stats | DMF | インデックス操作統計 |
| sys.dm_db_missing_index_details | DMV | 欠落インデックス詳細 |
| sys.dm_db_partition_stats | DMV | パーティション統計 |
| sys.stats | システムビュー | 統計情報 |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| 結果セット | TABLE | インデックス分析結果 |
| 指定テーブル | DB | @OutputTableName指定時 |

### 出力ファイル仕様

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

主要な出力カラム:
- Priority, check_id, findings_group, finding
- database_name, index_definition, secret_columns
- index_usage_summary, index_size_summary
- create_tsql, more_info

## 処理フロー

### 処理シーケンス

```
1. パラメータ検証
   └─ データベース存在チェック、オブジェクト名パース
2. 一時テーブル作成
   └─ #IndexSanity、#BlitzIndexResults等
3. インデックス情報収集
   └─ sys.indexesからの情報取得
4. 使用統計収集
   └─ sys.index_usage_statsとの結合
5. 欠落インデックス分析
   └─ sys.dm_db_missing_index_detailsの分析
6. 重複チェック
   └─ 類似インデックスの検出
7. 問題検出
   └─ ヒープ、未使用、重複等の検出
8. 結果出力
   └─ 優先度付きリストの生成
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B[パラメータ検証]
    B --> C{@GetAllDatabases?}
    C -->|Yes| D[全DB対象]
    C -->|No| E[指定DB対象]
    D & E --> F[一時テーブル作成]
    F --> G[インデックス情報収集]
    G --> H[使用統計収集]
    H --> I[欠落インデックス分析]
    I --> J[重複チェック]
    J --> K[問題検出]
    K --> L{@Mode判定}
    L -->|0| M[診断結果出力]
    L -->|1| N[サマリー出力]
    L -->|2| O[使用詳細出力]
    L -->|3| P[欠落詳細出力]
    M & N & O & P --> Q[バッチ終了]
```

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

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

| 処理 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| 情報取得 | sys.indexes | SELECT | インデックス定義取得 |
| 統計取得 | sys.index_usage_stats | SELECT | 使用統計取得 |
| 結果保存 | @OutputTableName | INSERT | 分析結果永続化 |

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

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

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| INSERT | 全インデックス情報 | sys.indexesからの取得 | 50以上のカラム |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | パラメータエラー | 無効な@OutputType | 'TABLE'または'NONE'を指定 |
| - | データベースエラー | 対象DBが存在しない | 正しいDB名を指定 |

### リトライ仕様

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

### 障害時対応

- 大規模DBでタイムアウトする場合は@ThresholdMBを上げる

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

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

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | データベース規模による |
| 目標処理時間 | 数秒〜数分 |
| メモリ使用量上限 | 環境依存 |

## 排他制御

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

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 開始ログ | 常時 | 'Starting run' + バージョン |
| 進捗ログ | 各ステップ | 'Create temp tables'等 |
| 終了ログ | 完了時 | 処理完了 |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| 該当なし | - | - |

## 備考

- バージョン: 8.29（2026年2月3日）
- ライセンス: MIT License
- 特記事項:
  - @Mode=0が最も包括的な診断
  - @ThresholdMB=250がデフォルトで小さいオブジェクトを除外
  - Columnstoreインデックスの詳細分析に対応
  - optimize_for_sequential_key属性に対応（SQL Server 2019以降）
