# 通知設計書 73-データ挿入開始

## 概要

本ドキュメントは、SQL Server First Responder Kitのsp_BlitzIndexプロシージャにおいて、一時テーブルへのデータ挿入を開始した際に出力される情報通知「データ挿入開始」について定義する。

### 本通知の処理概要

本通知は、sp_BlitzIndexストアドプロシージャ内で、#IndexSanityテーブルへのインデックス情報データの挿入を開始したことをユーザーに通知するための情報メッセージである。

**業務上の目的・背景**：sp_BlitzIndexは、SQL Serverのインデックス構成を診断するプロシージャである。診断の核心部分として、sys.indexes、sys.index_columnsなどのシステムビューからインデックス情報を収集し、#IndexSanityテーブルに格納する。この通知は、データ収集フェーズが開始されたことを管理者に知らせ、処理が正常に進行していることを確認するために必要である。

**通知の送信タイミング**：sp_BlitzIndexプロシージャのデータ収集フェーズにおいて、動的SQLの検証後、#IndexSanityテーブルへのINSERT処理を開始する直前に送信される。具体的にはsp_BlitzIndex.sqlの行1550で出力される。

**通知の受信者**：SQL Server Management Studio（SSMS）やその他のクライアントツールでsp_BlitzIndexを実行している管理者・DBA。メッセージタブに情報として表示される。

**通知内容の概要**：「Inserting data into #IndexSanity」という固定メッセージが出力される。これにより、インデックス情報のデータ収集が開始されたことが明確に示される。

**期待されるアクション**：この通知は情報提供目的であり、特別なアクションは不要。大規模なデータベースでは、このフェーズに時間がかかる可能性があるため、管理者は処理が進行中であることを確認できる。

## 通知種別

コンソール出力（RAISERROR WITH NOWAIT）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期（WITH NOWAIT指定により即時出力） |
| 優先度 | 低（情報レベル：severity 0） |
| リトライ | 無し |

### 送信先決定ロジック

実行中のセッションのクライアント（SSMSのメッセージタブ等）に対して直接出力される。特定の宛先決定ロジックは存在しない。

## 通知テンプレート

### コンソール出力の場合

| 項目 | 内容 |
|-----|------|
| 出力先 | クライアントのメッセージストリーム |
| メッセージレベル | 0（情報） |
| 状態 | 1 |

### 本文テンプレート

```
Inserting data into #IndexSanity
```

### 添付ファイル

なし

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| なし | 固定メッセージのため変数なし | - | - |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| プロシージャ内部処理 | データ挿入開始 | 動的SQL準備完了後、INSERT実行前 | @dsqlがNULLでない場合に出力 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| @dsql IS NULL | 動的SQLがNULLの場合、エラーとなり本通知は出力されない |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[sp_BlitzIndex開始] --> B[一時テーブル作成完了]
    B --> C[動的SQL構築]
    C --> D{@dsql IS NULL?}
    D -->|Yes| E["RAISERROR('@dsql is null',16,1)"]
    D -->|No| F["RAISERROR('Inserting data into #IndexSanity',0,1) WITH NOWAIT"]
    F --> G[デバッグモード時SQLプリント]
    G --> H["INSERT #IndexSanity EXEC sp_executesql @dsql"]
    H --> I[次のデータ収集フェーズへ]
    E --> J[処理中断]
```

## データベース参照・更新仕様

### 参照テーブル一覧

| テーブル名 | 用途 | 備考 |
|-----------|------|------|
| sys.indexes | インデックス定義情報の取得 | 動的SQL経由で参照 |
| sys.index_columns | インデックスカラム情報の取得 | 動的SQL経由で参照 |
| sys.dm_db_index_usage_stats | インデックス使用統計の取得 | 動的SQL経由で参照 |
| sys.objects | オブジェクト情報の取得 | 動的SQL経由で参照 |
| sys.schemas | スキーマ情報の取得 | 動的SQL経由で参照 |

### テーブル別参照項目詳細

#### sys.indexes
| 参照項目（カラム名） | 用途 | 取得条件 |
|-------------------|------|---------|
| object_id | オブジェクト識別 | 指定データベース内 |
| index_id | インデックス識別 | - |
| name | インデックス名 | - |
| type | インデックスタイプ | - |
| is_unique | ユニーク制約フラグ | - |
| is_primary_key | 主キーフラグ | - |

### 更新テーブル一覧

| テーブル名 | 操作 | 概要 |
|-----------|------|------|
| #IndexSanity | INSERT | インデックス情報を格納 |

#### #IndexSanityテーブル

| 操作 | 項目（カラム名） | 更新値 | 備考 |
|-----|-----------------|-------|------|
| INSERT | database_id | 対象データベースID | - |
| INSERT | object_id | オブジェクトID | - |
| INSERT | index_id | インデックスID | - |
| INSERT | index_type | インデックスタイプ | - |
| INSERT | database_name | データベース名 | - |
| INSERT | schema_name | スキーマ名 | - |
| INSERT | object_name | オブジェクト名 | - |
| INSERT | index_name | インデックス名 | - |

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| @dsql is null | 動的SQLの構築に失敗した場合 | エラーメッセージ出力後、処理中断 |

### リトライ仕様

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

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 1分あたり上限 | 制限なし |
| 1日あたり上限 | 制限なし |

### 配信時間帯

制限なし（sp_BlitzIndex実行時に常に出力）

## セキュリティ考慮事項

- 本通知は固定の情報メッセージであり、機密情報を含まない
- VIEW SERVER STATE権限を持つユーザーのみがsp_BlitzIndexを実行可能

## 備考

- WITH NOWAIT指定により、バッファリングされずに即時クライアントに送信される
- @Debug = 1の場合、@dsqlの内容がPRINTステートメントで出力される
- 類似の通知として「Inserting data into #IndexSanitySize」も存在する（行2957）

---

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

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

### 推奨読解順序

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

#IndexSanityテーブルの構造を理解することで、収集されるインデックス情報を把握する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | sp_BlitzIndex.sql | `sp_BlitzIndex.sql` | 行386-434の#IndexSanityテーブル定義を確認 |

**読解のコツ**: 各カラムの名前とデータ型から、どのようなインデックス属性が収集されるかを理解する。

#### Step 2: 動的SQLの構築を理解する

INSERT対象となる動的SQLがどのように構築されるかを確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | sp_BlitzIndex.sql | `sp_BlitzIndex.sql` | 行1280-1546付近の@dsql構築ロジック |

**主要処理フロー**:
1. **行1280付近**: 動的SQLの開始
2. **行1540-1546**: SQLオプション追加
3. **行1547-1548**: @dsql NULL チェック

#### Step 3: データ挿入処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | sp_BlitzIndex.sql | `sp_BlitzIndex.sql` | 行1550-1569のINSERT処理 |

**主要処理フロー**:
- **行1550**: `RAISERROR (N'Inserting data into #IndexSanity',0,1) WITH NOWAIT;`
- **行1551-1563**: デバッグモード時のSQL出力
- **行1564-1569**: `INSERT #IndexSanity ... EXEC sp_executesql @dsql`

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

```
sp_BlitzIndex（エントリーポイント）
    │
    ├─ 一時テーブル作成（#IndexSanity等）
    │
    ├─ データベースループ開始
    │      │
    │      ├─ 動的SQL構築（@dsql）
    │      │
    │      ├─ @dsql NULLチェック
    │      │
    │      ├─ RAISERROR('Inserting data into #IndexSanity') ← 本通知
    │      │
    │      └─ INSERT #IndexSanity EXEC sp_executesql @dsql
    │
    └─ 分析・結果出力
```

### データフロー図

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

sys.indexes              ───▶ 動的SQL構築             ───▶ クライアントメッセージ
sys.index_columns              │                                 「Inserting data into #IndexSanity」
sys.dm_db_index_usage_stats    │
                               ├─ sp_executesql実行
                               │
                               └─ #IndexSanityにINSERT  ───▶ 一時テーブルにデータ格納
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| sp_BlitzIndex.sql | `sp_BlitzIndex.sql` | ソース | メインプロシージャ。データ挿入通知を出力（行1550） |
| Install-All-Scripts.sql | `Install-All-Scripts.sql` | インストール | 全スクリプトを含むインストールファイル（行22873） |
| Install-Azure.sql | `Install-Azure.sql` | インストール | Azure向けインストールファイル（行15778） |
| Deprecated/sp_BlitzIndex_SQL_Server_2005.sql | `Deprecated/sp_BlitzIndex_SQL_Server_2005.sql` | 旧バージョン | SQL Server 2005向け旧バージョン（行608） |
