# 通知設計書 55-ストアドプロシージャ情報なし

## 概要

本ドキュメントは、sp_BlitzCache実行時に指定されたストアドプロシージャの情報がプランキャッシュに見つからない場合に発生する警告通知について定義する。

### 本通知の処理概要

sp_BlitzCacheは@StoredProcNameパラメータを使用して特定のストアドプロシージャのプランキャッシュ情報を検索できる。検索の結果、該当するストアドプロシージャの情報（SQL Handle）が見つからない場合、ユーザーに通知を行い処理を終了する。

**業務上の目的・背景**：特定のストアドプロシージャのパフォーマンス分析を行いたい場合、@StoredProcNameで対象を指定する。しかし、該当プロシージャが一度も実行されていない、またはプランキャッシュからクリアされている場合は分析対象が存在しない。この状況をユーザーに明確に通知し、対象が見つからなかった理由を理解できるようにする。

**通知の送信タイミング**：sp_BlitzCache実行時に、@StoredProcNameパラメータが指定され、sys.dm_exec_procedure_stats（およびSQL Server 2016以降ではsys.dm_exec_function_stats）を検索した結果、#only_sql_handlesテーブルにレコードが0件の場合。

**通知の受信者**：sp_BlitzCacheを実行したSQL Serverユーザー（DBA、開発者など）。

**通知内容の概要**：指定されたストアドプロシージャの情報が見つからなかったことを通知する。

**期待されるアクション**：ユーザーは以下を確認する必要がある：(1) ストアドプロシージャ名のスペルが正しいか、(2) 対象プロシージャが最近実行されたか、(3) プランキャッシュがクリアされていないか。必要に応じてプロシージャを実行してからsp_BlitzCacheを再実行する。

## 通知種別

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

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期（RAISERROR WITH NOWAITによる即時出力） |
| 優先度 | 中（警告レベル、重大度0） |
| リトライ | なし |

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

sp_BlitzCacheを実行したセッションのメッセージ出力に直接表示される。

## 通知テンプレート

### コンソール出力

| 項目 | 内容 |
|-----|------|
| 出力方法 | RAISERROR WITH NOWAIT（重大度0、状態1） |
| メッセージタイプ | 情報メッセージ |

### 本文テンプレート

```
No information for that stored procedure was found.
```

### 添付ファイル

なし

## テンプレート変数

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

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| ストアドプロシージャ実行 | sp_BlitzCache実行（@StoredProcName指定時） | SELECT COUNT(*) FROM #only_sql_handles = 0 | プランキャッシュに該当プロシージャの情報がない場合 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| @StoredProcName IS NULL | ストアドプロシージャフィルタが指定されていない場合 |
| #only_sql_handlesにレコードが存在 | 該当プロシージャのSQL Handleが見つかった場合 |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[sp_BlitzCache実行] --> B{@StoredProcName指定?}
    B -->|No| Z[通常のキャッシュ分析]
    B -->|Yes| C[sys.dm_exec_procedure_stats検索]
    C --> D[結果を#only_sql_handlesに挿入]
    D --> E{SQL Server 2016+?}
    E -->|Yes| F[sys.dm_exec_function_stats検索]
    E -->|No| G{#only_sql_handles件数 = 0?}
    F --> H[結果を#only_sql_handlesに追加]
    H --> G
    G -->|No| I[指定プロシージャの分析実行]
    G -->|Yes| J[RAISERROR 警告メッセージ]
    J --> K[RETURN 処理終了]
    I --> L[終了]
    Z --> L
```

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

### 参照テーブル一覧

| テーブル名 | 用途 | 備考 |
|-----------|------|------|
| sys.dm_exec_procedure_stats | ストアドプロシージャのSQL Handle取得 | DMV |
| sys.dm_exec_function_stats | 関数のSQL Handle取得（SQL Server 2016+） | DMV |
| #only_sql_handles | 検索結果の一時格納 | 一時テーブル |

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

#### sys.dm_exec_procedure_stats

| 参照項目（カラム名） | 用途 | 取得条件 |
|-------------------|------|---------|
| sql_handle | SQLハンドル | WHERE OBJECT_NAME(object_id, database_id) = @StoredProcName |
| object_id | オブジェクトID | フィルタ条件 |
| database_id | データベースID | OBJECT_NAME関数のパラメータ |

### 更新テーブル一覧

| テーブル名 | 操作 | 概要 |
|-----------|------|------|
| #only_sql_handles | INSERT | 検索結果を格納 |

#### #only_sql_handles

| 操作 | 項目（カラム名） | 更新値 | 備考 |
|-----|-----------------|-------|------|
| INSERT | sql_handle | 該当プロシージャのSQL Handle | 検索結果 |

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| 情報なし | プランキャッシュに該当プロシージャがない | RAISERRORで警告しRETURN |

### リトライ仕様

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

## 配信設定

### レート制限

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

### 配信時間帯

制限なし（sp_BlitzCache実行時に即時出力）

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

- 本通知には機密情報は含まれない
- ストアドプロシージャ名は表示されないため、セキュリティリスクは低い

## 備考

- プランキャッシュはSQL Server再起動、DBCC FREEPROCCACHE、メモリプレッシャー等でクリアされる可能性がある
- ストアドプロシージャが一度も実行されていない場合も情報は存在しない
- SQL Server 2016以降では関数（sys.dm_exec_function_stats）も検索対象に含まれる
- 通知後はRETURNで処理が終了し、それ以降の分析は行われない

---

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

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

### 推奨読解順序

#### Step 1: ストアドプロシージャ検索ロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | sp_BlitzCache.sql | `sp_BlitzCache.sql` | @StoredProcName検索のロジック |

**主要処理フロー**:
1. **行1815-1822**: sys.dm_exec_function_stats検索（SQL Server 2016+）
2. **行1825-1829**: #only_sql_handlesの件数チェックと警告出力

**読解のコツ**: @StoredProcNameが指定された場合、sys.dm_exec_procedure_statsとsys.dm_exec_function_statsの両方を検索する。両方で見つからない場合に警告が出る。

#### Step 2: SQL Handle一時テーブルを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | sp_BlitzCache.sql | `sp_BlitzCache.sql` | #only_sql_handlesテーブルの構造と使用方法 |

**主要処理フロー**:
- sys.dm_exec_procedure_statsから取得したsql_handleを格納
- sys.dm_exec_function_statsからも追加で格納（SQL Server 2016+）
- COUNT(*)が0の場合に警告を出力

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

```
sp_BlitzCache (エントリーポイント)
    │
    ├─ [条件チェック] @StoredProcName IS NOT NULL?
    │      │
    │      └─ [Yes]
    │             │
    │             ├─ [動的SQL] sys.dm_exec_procedure_stats
    │             │      └─ WHERE OBJECT_NAME(object_id, database_id) = @StoredProcName
    │             │             └─ INSERT #only_sql_handles (sql_handle)
    │             │
    │             ├─ [条件チェック] SQL Server 2016+?
    │             │      │
    │             │      └─ [Yes] sys.dm_exec_function_stats検索
    │             │             └─ INSERT #only_sql_handles (sql_handle)
    │             │
    │             └─ [件数チェック] SELECT COUNT(*) FROM #only_sql_handles
    │                    │
    │                    ├─ [= 0] RAISERROR 'No information...'
    │                    │        └─ RETURN
    │                    │
    │                    └─ [> 0] 分析処理継続
    │
    └─ [以降のキャッシュ分析処理]
```

### データフロー図

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

@StoredProcName ─────────▶ [検索条件]
                              │
                              ▼
                    sys.dm_exec_procedure_stats
                              │
                              ▼
                    [sql_handle取得]
                              │
                              ▼
                    #only_sql_handles
                              │
                              ▼
                    [SQL Server 2016+の場合]
                              │
                              ▼
                    sys.dm_exec_function_stats
                              │
                              ▼
                    [sql_handle追加]
                              │
                              ▼
                    [COUNT(*) = 0?]
                              │
                    ┌─────────┴──────────┐
                    │                    │
                    ▼                    ▼
               [= 0]                [> 0]
                    │                    │
                    ▼                    ▼
           RAISERROR警告         分析処理継続
           + RETURN
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| sp_BlitzCache.sql | `sp_BlitzCache.sql` | ソース | 本通知を発生させるメインプロシージャ（行1825-1829） |
| Install-All-Scripts.sql | `Install-All-Scripts.sql` | ソース | 全スクリプト一括インストール（行14981-14985に同一ロジック） |
| Install-Azure.sql | `Install-Azure.sql` | ソース | Azure向けインストール（行2716-2720に同一ロジック） |
