# バッチ設計書 14-sp_BlitzInMemoryOLTP

## 概要

本ドキュメントは、sp_BlitzInMemoryOLTPストアドプロシージャのバッチ設計書です。本プロシージャは、SQL ServerのIn-Memory OLTP（Hekaton）オブジェクトに関する詳細情報を取得・分析する非推奨（Deprecated）ストアドプロシージャです。

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

sp_BlitzInMemoryOLTPは、SQL Server 2014以降で利用可能なIn-Memory OLTP機能を使用しているデータベースとオブジェクトの詳細情報を収集・レポートするストアドプロシージャです。メモリ最適化テーブル、ネイティブコンパイルモジュール、ハッシュインデックスのバケット統計など、In-Memory OLTPの構成と状態を包括的に分析します。

**業務上の目的・背景**：In-Memory OLTPは高速なトランザクション処理を実現しますが、その設計と運用には専門知識が必要です。本プロシージャは、In-Memory OLTPオブジェクトの構成状態、メモリ使用状況、インデックス効率などを可視化し、パフォーマンスの最適化や問題の早期発見を支援します。現在は非推奨となっています。

**バッチの実行タイミング**：In-Memory OLTP環境の構成確認、パフォーマンス分析、または定期的な健全性チェック時に手動実行します。

**主要な処理内容**：
1. In-Memory OLTPサポートの確認（バージョン・エディション）
2. メモリ最適化データベースの検出
3. メモリ最適化テーブルの一覧と統計情報の取得
4. インデックス情報とメモリ消費の分析
5. ハッシュインデックスのバケット統計分析
6. ネイティブコンパイルモジュールの検出と実行統計
7. テンポラルテーブル情報の取得（SQL Server 2016以降）
8. LOBカラムのメモリ消費者情報
9. メモリ最適化テーブル型の検出
10. コンテナとファイル詳細の分析

**前後の処理との関連**：単独で実行可能な診断ツールです。In-Memory OLTP機能が有効なデータベースが存在する環境で使用します。

**影響範囲**：読み取り専用の分析処理であり、対象データベースへの書き込みは行いません。一時テーブルを使用して分析結果を蓄積します。

## バッチ種別

診断・分析 / In-Memory OLTP分析

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（手動実行） |
| 実行時刻 | 任意 |
| 実行曜日 | 該当なし |
| 実行日 | 該当なし |
| トリガー | 手動実行 |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| SQL Server 2014以降 | In-Memory OLTP機能のサポートに必要 |
| Azure SQL Database Premium | Azure環境ではPremiumティアが必要 |
| SQL 2014 Enterprise Edition | 2014ではEnterprise/Developerのみ対応 |
| SQL 2016 SP1以降 Standard | 2016 SP1以降はStandardでも対応 |
| In-Memory対応データベース | 対象DBがIn-Memory OLTPをサポート |

### 実行可否判定

- SQL Serverバージョンが2014（12.x）以降であること
- Azure SQL Databaseの場合、Premiumティアであること（XTPサポート必須）
- SQL Server 2014の場合、Enterprise/Developer Editionであること
- SQL Server 2016の場合、SP1以降であること（ビルド13.0.4001.0以上）
- 対象データベースがIn-Memory OLTPをサポートしていること

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| @instanceLevelOnly | BIT | No | 0 | 1の場合、インスタンスレベルの情報のみ取得 |
| @dbName | NVARCHAR(4000) | No | N'ALL' | 分析対象のデータベース名（'ALL'で全データベース） |
| @tableName | NVARCHAR(4000) | No | NULL | 特定のテーブル名に絞って分析 |
| @debug | BIT | No | 0 | 1の場合、動的SQLをPRINTのみ実行しない |
| @Version | VARCHAR(30) | No | NULL | OUTPUT: バージョン番号を返却 |
| @VersionDate | DATETIME | No | NULL | OUTPUT: バージョン日付を返却 |
| @VersionCheckMode | BIT | No | 0 | 1の場合、バージョン確認のみで終了 |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| sys.databases | DB | データベース一覧 |
| sys.database_files | DB | データベースファイル情報 |
| sys.filegroups | DB | ファイルグループ情報（FXタイプ） |
| sys.dm_db_xtp_table_memory_stats | DB | テーブルメモリ統計 |
| sys.dm_db_xtp_memory_consumers | DB | メモリ消費者情報 |
| sys.dm_db_xtp_hash_index_stats | DB | ハッシュインデックス統計 |
| sys.dm_db_xtp_index_stats | DB | インデックス統計 |
| sys.dm_exec_procedure_stats | DB | プロシージャ実行統計 |
| sys.dm_os_loaded_modules | DB | ロード済みネイティブDLL |
| sys.tables | DB | テーブル情報（is_memory_optimized） |
| sys.indexes | DB | インデックス情報 |
| sys.sql_modules | DB | モジュール定義 |
| sys.table_types | DB | テーブル型情報 |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| Memory-optimized databases | Table | メモリ最適化データベース一覧 |
| Memory optimized tables | Table | メモリ最適化テーブル一覧と統計 |
| List indexes | Table | インデックス一覧とメモリ使用量 |
| Hash bucket stats | Table | ハッシュインデックスバケット統計 |
| Native modules | Table | ネイティブコンパイルモジュール一覧 |
| Container details | Table | コンテナ詳細情報 |
| その他多数 | Table | LOB、テンポラル、テーブル型等 |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | 該当なし（結果セット出力） |
| 出力先 | SSMSまたはクライアントアプリケーション |
| 文字コード | N/A |
| 区切り文字 | N/A |

## 処理フロー

### 処理シーケンス

```
1. バージョン・エディションチェック
   └─ SQL Server 2014以降、エディション確認
2. Azure環境チェック
   └─ Premium/XTPサポート確認
3. 対象データベース検出
   └─ FXファイルグループを持つDBを検出
4. @tableNameフィルタ適用
   └─ 特定テーブル指定時は対象DBを絞り込み
5. 各データベースのループ処理
   5.1 メモリ最適化テーブル情報取得
   5.2 インデックス情報取得
   5.3 ハッシュバケット統計取得
   5.4 ネイティブモジュール情報取得
   5.5 テンポラルテーブル情報取得（2016以降）
   5.6 LOBメモリ消費者情報取得
   5.7 テーブル型情報取得
   5.8 コンテナ/ファイル詳細取得
6. 結果出力
   └─ 収集した各種情報を結果セットとして出力
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B{バージョンチェック}
    B -->|2014未満| Z[エラー終了]
    B -->|2014以上| C{エディションチェック}
    C -->|非対応| Z
    C -->|対応| D{Azure環境?}
    D -->|Yes| E{XTPサポート?}
    E -->|No| Z
    E -->|Yes| F[対象DB検出]
    D -->|No| F
    F --> G{@instanceLevelOnly?}
    G -->|Yes| H[インスタンス情報のみ]
    G -->|No| I{対象DB存在?}
    I -->|No| Z
    I -->|Yes| J[DBループ開始]
    J --> K[テーブル情報取得]
    K --> L[インデックス情報取得]
    L --> M[ハッシュバケット統計]
    M --> N[ネイティブモジュール情報]
    N --> O{SQL 2016以降?}
    O -->|Yes| P[テンポラル情報取得]
    O -->|No| Q[スキップ]
    P --> R[LOB情報取得]
    Q --> R
    R --> S[テーブル型情報取得]
    S --> T[コンテナ詳細取得]
    T --> U{次のDB?}
    U -->|Yes| J
    U -->|No| V[結果出力]
    H --> V
    V --> W[バッチ終了]
```

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

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

| 処理 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| DB検出 | sys.databases | SELECT | オンラインDB一覧 |
| FG確認 | sys.filegroups | SELECT | FXタイプファイルグループ |
| テーブル情報 | sys.dm_db_xtp_table_memory_stats | SELECT | テーブルメモリ統計 |
| インデックス情報 | sys.dm_db_xtp_memory_consumers | SELECT | メモリ消費者 |
| バケット統計 | sys.dm_db_xtp_hash_index_stats | SELECT | ハッシュバケット |
| モジュール情報 | sys.dm_os_loaded_modules | SELECT | ネイティブDLL |
| 実行統計 | sys.dm_exec_procedure_stats | SELECT | プロシージャ統計 |

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

#### sys.dm_db_xtp_table_memory_stats

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| SELECT | memory_allocated_for_table_kb | メモリ割当量 | KB単位 |
| SELECT | memory_used_by_table_kb | メモリ使用量 | KB単位 |
| SELECT | memory_allocated_for_indexes_kb | インデックスメモリ割当 | KB単位 |
| SELECT | memory_used_by_indexes_kb | インデックスメモリ使用 | KB単位 |

#### sys.dm_db_xtp_hash_index_stats

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| SELECT | total_bucket_count | 総バケット数 | |
| SELECT | empty_bucket_count | 空バケット数 | |
| SELECT | avg_chain_length | 平均チェーン長 | 理想は1 |
| SELECT | max_chain_length | 最大チェーン長 | |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 55001 | Azure非対応 | Azure SQL DB非Premiumティア | Premiumティアにアップグレード |
| 55002 | エディション非対応 | SQL 2014非Enterprise | Enterprise/Developerを使用 |
| 55003 | バージョン非対応 | SQL 2016 SP1未満 | SP1以降にアップデート |
| 55004 | パラメータエラー | @dbNameがNULL | データベース名またはALLを指定 |
| 55005 | DB不存在 | 指定DBが存在しない | 正しいデータベース名を指定 |
| 55006 | データなし | ALLで対象DBなし | In-Memory対応DBを作成 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし（診断ツールのため） |
| リトライ間隔 | 該当なし |
| リトライ対象エラー | 該当なし |

### 障害時対応

エラー発生時はTHROW文でカスタムエラーが発生します。エラーメッセージに従って前提条件（バージョン、エディション、In-Memoryサポート）を確認してください。

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | なし（読み取り専用） |
| コミットタイミング | 該当なし |
| ロールバック条件 | 該当なし |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | In-Memoryオブジェクト数に依存 |
| 目標処理時間 | 数秒〜数分（オブジェクト数依存） |
| メモリ使用量上限 | 一時テーブルサイズに依存 |

## 排他制御

- 読み取り専用の診断ツールであるため、排他制御なし
- 他のセッションへの影響なし

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 状態出力 | 各DB処理開始時 | now processing database: [DB名] |
| デバッグログ | @debug=1時 | 動的SQL文（実行せずPRINTのみ） |
| 結果セット | 各情報取得後 | テーブル/インデックス/統計情報 |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| ハッシュバケット空率 | 10%未満で警告 | 結果セット内に状態表示 |
| 平均チェーン長 | 10超で警告 | 結果セット内に状態表示 |

## 備考

- バージョン：1.8（内部バージョン）/ 8.19相当（2024-02-22）
- 本プロシージャは非推奨（Deprecated）であり、Deprecatedフォルダに移動済み
- SQL Server 2014以降が必須
- 原作者：Ned Otter
- 主要コントリビューター：Ned Otter, Konstantin Taranov, Aleksey Nagorskiy
- SQL Server 2014, 2016, 2017でテスト済み
- Azure SQL Databaseでテスト済み（Azure Managed Instancesは未テスト）
- @dbName='ALL'で全データベースを分析可能
- @tableNameで特定テーブルに絞った分析が可能
- ハッシュインデックスの最適化に関する推奨事項：
  - 空バケット率33%が目標（90%でも許容範囲、10%未満は要注意）
  - 平均チェーン長1が理想（10以下は許容、10超は要注意）
- SQL Server 2016以降ではテンポラルテーブルのIn-Memory履歴テーブル情報も取得
- sys.dm_os_loaded_modulesを使用してロード済みネイティブDLLを検出（Azure非対応）
