# SQL Server First Responder Kit コードリーディングガイドライン

## はじめに

このガイドラインは、SQL Server First Responder Kitのコードベースを効率的に理解するための手引きです。
T-SQL（Transact-SQL）に精通していないエンジニアでも、段階的に学習できるよう構成されています。

**対象読者:**
- プロジェクトに新規参画するエンジニア
- 他言語からの経験者
- コードレビューを行う担当者

**プロジェクト概要:**
SQL Server First Responder Kitは、Brent Ozar Unlimited社が開発・維持するオープンソースのSQL Server診断ツール群です。DBA、システム管理者、開発者がSQL Serverのパフォーマンス問題を診断・解決するためのストアドプロシージャを提供しています。

---

## 1. 言語基礎

> このセクションでは、T-SQL（Transact-SQL）の基本構文と概念を解説します。

### 1.1 プログラム構造

T-SQLはSQL Serverで使用されるSQLの拡張言語です。本プロジェクトのすべてのスクリプトはストアドプロシージャとして実装されています。

基本的なストアドプロシージャの構造:

```sql
-- ファイル: sp_Blitz.sql:1-5
IF OBJECT_ID('dbo.sp_Blitz') IS NULL
  EXEC ('CREATE PROCEDURE dbo.sp_Blitz AS RETURN 0;');
GO

ALTER PROCEDURE [dbo].[sp_Blitz]
```

**解説:**
- `IF OBJECT_ID(...) IS NULL`: オブジェクトの存在確認
- `EXEC ('...')`: 動的SQLの実行
- `GO`: バッチ区切り（T-SQL固有）
- `ALTER PROCEDURE`: プロシージャの変更（存在しない場合はCREATE後にALTER）

### 1.2 データ型と変数

プロジェクトで頻繁に使用されるデータ型と変数宣言:

```sql
-- ファイル: sp_Blitz.sql:132-165
DECLARE @StringToExecute NVARCHAR(4000)
    ,@curr_tracefilename NVARCHAR(500)
    ,@ProductVersion NVARCHAR(128)
    ,@ProductVersionMajor DECIMAL(10,2)
    ,@CurrentCheckID INT
    ,@CurrentPriority INT
    ,@IsWindowsOperatingSystem BIT
    ,@DaysUptime NUMERIC(23,2)
```

**主要なデータ型:**
| データ型 | 説明 | 使用例 |
|---------|------|--------|
| `NVARCHAR(n)` | Unicode可変長文字列 | データベース名、クエリテキスト |
| `VARCHAR(n)` | 非Unicode可変長文字列 | URL、静的テキスト |
| `INT` | 32ビット整数 | CheckID、Priority |
| `BIT` | ブール値（0/1） | フラグ値 |
| `TINYINT` | 8ビット整数（0-255） | 優先度、モード |
| `DECIMAL(p,s)` | 固定小数点数 | バージョン番号 |
| `BIGINT` | 64ビット整数 | 大きなカウンター値 |
| `DATETIME` | 日時 | バージョン日付 |
| `XML` | XML型 | クエリプラン |

### 1.3 制御構造

条件分岐とループの例:

```sql
-- ファイル: sp_Blitz.sql:45-48
IF(@VersionCheckMode = 1)
BEGIN
    RETURN;
END;
```

```sql
-- ファイル: sp_Blitz.sql:50-122
IF @Help = 1
BEGIN
    PRINT '
    /*
    sp_Blitz from http://FirstResponderKit.org
    ...
    */';
    RETURN;
END;    /* @Help = 1 */
```

**制御構造パターン:**
- `IF ... BEGIN ... END`: 条件分岐（複数ステートメント）
- `IF ... ELSE`: 条件分岐
- `WHILE`: ループ（本プロジェクトでは限定的に使用）
- `RETURN`: プロシージャからの早期終了

### 1.4 関数/メソッド定義

ストアドプロシージャのパラメータ定義:

```sql
-- ファイル: sp_Blitz.sql:5-35
ALTER PROCEDURE [dbo].[sp_Blitz]
    @Help TINYINT = 0 ,
    @CheckUserDatabaseObjects TINYINT = 1 ,
    @CheckProcedureCache TINYINT = 0 ,
    @OutputType VARCHAR(20) = 'TABLE' ,
    @OutputDatabaseName NVARCHAR(256) = NULL ,
    @Debug TINYINT = 0 ,
    @Version     VARCHAR(30) = NULL OUTPUT,
    @VersionDate DATETIME = NULL OUTPUT,
    @VersionCheckMode BIT = 0
WITH RECOMPILE
AS
```

**パラメータの種類:**
- 入力パラメータ: `@Help TINYINT = 0`（デフォルト値付き）
- 出力パラメータ: `@Version VARCHAR(30) = NULL OUTPUT`
- `WITH RECOMPILE`: 毎回実行プランを再コンパイル

### 1.5 モジュール/インポート

T-SQLには明示的なインポート機構はありませんが、以下の方法で他のプロシージャを呼び出します:

```sql
-- ファイル: sp_BlitzFirst.sql:291
EXEC (@BlitzWho);
```

```sql
-- ファイル: sp_BlitzFirst.sql:137
@BlitzWho NVARCHAR(MAX) = N'EXEC dbo.sp_BlitzWho @ShowSleepingSPIDs = ' + CONVERT(NVARCHAR(1), @ShowSleepingSPIDs) + N';',
```

---

## 2. プロジェクト固有の概念

> このセクションでは、当プロジェクト特有の概念を解説します。

### 2.1 フレームワーク固有の概念

#### 動的管理ビュー（DMV）の活用

SQL Serverの動的管理ビューを駆使してシステム状態を診断:

```sql
-- ファイル: sp_BlitzFirst.sql:324-326
SELECT @logical_processors = COUNT(*)
    FROM sys.dm_os_schedulers
    WHERE status = 'VISIBLE ONLINE';
```

**頻繁に参照されるDMV:**
| DMV | 用途 |
|-----|------|
| `sys.dm_exec_query_stats` | クエリ実行統計 |
| `sys.dm_exec_procedure_stats` | プロシージャ実行統計 |
| `sys.dm_os_wait_stats` | 待機統計 |
| `sys.dm_io_virtual_file_stats` | I/O統計 |
| `sys.dm_os_schedulers` | スケジューラー情報 |

#### 一時テーブルの活用

結果収集用に一時テーブルを大量に使用:

```sql
-- ファイル: sp_Blitz.sql:480-494
IF OBJECT_ID('tempdb..#BlitzResults') IS NOT NULL
    DROP TABLE #BlitzResults;
CREATE TABLE #BlitzResults
    (
      ID INT IDENTITY(1, 1) ,
      CheckID INT ,
      DatabaseName NVARCHAR(128) ,
      Priority TINYINT ,
      FindingsGroup VARCHAR(50) ,
      Finding VARCHAR(200) ,
      URL VARCHAR(200) ,
      Details NVARCHAR(4000) ,
      QueryPlan [XML] NULL ,
      QueryPlanFiltered [NVARCHAR](MAX) NULL
    );
```

### 2.2 プロジェクト独自のパターン

#### バージョン管理パターン

すべてのプロシージャで統一されたバージョン管理:

```sql
-- ファイル: sp_Blitz.sql:42
SELECT @Version = '8.29', @VersionDate = '20260203';
```

#### VersionCheckModeパターン

バージョン確認のみで即座に終了:

```sql
-- ファイル: sp_Blitz.sql:45-48
IF(@VersionCheckMode = 1)
BEGIN
    RETURN;
END;
```

#### Helpパターン

すべてのプロシージャで統一されたヘルプ表示:

```sql
-- ファイル: sp_Blitz.sql:50-51
IF @Help = 1
BEGIN
    PRINT '...'
    RETURN;
END;
```

#### CheckIDパターン

検出項目に一意のIDを付与:

```sql
-- ファイル: sp_Blitz.sql:690-696
SELECT 223 AS CheckID ,
         0 AS Priority ,
         'Informational' AS FindingsGroup ,
         'Some Checks Skipped' AS Finding ,
         '' AS URL ,
         'User ''' + @SUSER_NAME + ''' is not part of the sysadmin role...' AS Details;
```

---

## 3. 命名規則

> このセクションでは、プロジェクト全体で使用される命名規則を解説します。

### 3.1 ファイル・ディレクトリ命名

| パターン | 意味 | 例 |
|---------|------|-----|
| `sp_Blitz*.sql` | Blitzシリーズのストアドプロシージャ | `sp_Blitz.sql`, `sp_BlitzCache.sql` |
| `sp_*.sql` | その他のストアドプロシージャ | `sp_DatabaseRestore.sql`, `sp_ineachdb.sql` |
| `Install-*.sql` | インストールスクリプト | `Install-All-Scripts.sql`, `Install-Azure.sql` |
| `Uninstall.sql` | アンインストールスクリプト | `Uninstall.sql` |
| `*_by_Priority.md` | チェック項目の優先度別ドキュメント | `sp_Blitz_Checks_by_Priority.md` |

### 3.2 クラス・関数・変数命名

| プレフィックス/サフィックス | 意味 | 例 |
|---------------------------|------|-----|
| `@` | ローカル変数/パラメータ | `@Help`, `@Debug`, `@Version` |
| `@@` | システム関数 | `@@SPID`, `@@VERSION` |
| `#` | ローカル一時テーブル | `#BlitzResults`, `#SkipChecks` |
| `##` | グローバル一時テーブル | `##BlitzCacheProcs`, `##BlitzCacheResults` |
| `sp_` | ストアドプロシージャ | `sp_Blitz`, `sp_BlitzCache` |
| `@Output*` | 出力先パラメータ | `@OutputDatabaseName`, `@OutputTableName` |
| `@Skip*` | スキップフラグ | `@SkipChecks`, `@SkipStatistics` |
| `@Check*` | チェック対象フラグ | `@CheckUserDatabaseObjects` |
| `*ID` | 識別子 | `CheckID`, `DatabaseID` |

### 3.3 プログラム分類一覧

| カテゴリ | プログラム | 主な機能 |
|---------|-----------|---------|
| ヘルスチェック | `sp_Blitz` | サーバー全体の健全性チェック |
| クエリ分析 | `sp_BlitzCache` | リソース集約型クエリの特定 |
| リアルタイム診断 | `sp_BlitzFirst` | 現在のパフォーマンス問題診断 |
| インデックス分析 | `sp_BlitzIndex` | インデックス設計・パフォーマンス分析 |
| デッドロック分析 | `sp_BlitzLock` | デッドロック分析 |
| 現在の実行状態 | `sp_BlitzWho` | 実行中クエリの詳細表示 |
| 履歴分析 | `sp_BlitzAnalysis` | BlitzFirst出力テーブルの分析 |
| バックアップ分析 | `sp_BlitzBackups` | RPO/RTO推定 |
| リストアユーティリティ | `sp_DatabaseRestore` | マルチファイルリストア補助 |
| ユーティリティ | `sp_ineachdb` | 各データベースでコマンド実行 |

---

## 4. ディレクトリ構造

> このセクションでは、プロジェクトのディレクトリ構造を解説します。

```
SQL-Server-First-Responder-Kit/
├── sp_Blitz.sql                    # 主要プロシージャ（健全性チェック）
├── sp_BlitzCache.sql               # クエリキャッシュ分析
├── sp_BlitzFirst.sql               # リアルタイム診断
├── sp_BlitzIndex.sql               # インデックス分析
├── sp_BlitzLock.sql                # デッドロック分析
├── sp_BlitzWho.sql                 # 実行中クエリ表示
├── sp_BlitzAnalysis.sql            # 履歴分析
├── sp_BlitzBackups.sql             # バックアップ分析
├── sp_DatabaseRestore.sql          # リストアユーティリティ
├── sp_ineachdb.sql                 # 各DB実行ユーティリティ
├── SqlServerVersions.sql           # SQLServerバージョン情報テーブル
├── Install-All-Scripts.sql         # 全スクリプトインストール用
├── Install-Azure.sql               # Azure SQL DB用インストール
├── Uninstall.sql                   # アンインストールスクリプト
├── README.md                       # プロジェクト説明
├── CONTRIBUTING.md                 # 貢献ガイドライン
├── LICENSE.md                      # MITライセンス
├── CODE_OF_CONDUCT.md              # 行動規範
├── Documentation/                  # ドキュメント
│   ├── sp_Blitz_Checks_by_Priority.md
│   ├── sp_BlitzCache_Checks_by_Priority.md
│   ├── sp_BlitzFirst_Checks_by_Priority.md
│   ├── sp_BlitzIndex_Checks_by_Priority.md
│   └── Development/                # 開発用ドキュメント
│       ├── ReleaseProcess.md
│       └── _TestBed.sql
├── Deprecated/                     # 非推奨スクリプト
│   ├── sp_Blitz_SQL_Server_2005.sql
│   ├── sp_BlitzCache_SQL_Server_2005.sql
│   ├── sp_BlitzIndex_SQL_Server_2005.sql
│   ├── sp_BlitzInMemoryOLTP.sql
│   ├── sp_BlitzQueryStore.sql
│   ├── sp_AllNightLog.sql
│   ├── sp_AllNightLog_Setup.sql
│   └── readme.txt
└── .github/                        # GitHub設定
    ├── ISSUE_TEMPLATE/
    └── workflows/
```

### 各ディレクトリの役割

| ディレクトリ | 役割 | 主要ファイル |
|-------------|------|-------------|
| `/`（ルート） | 主要なストアドプロシージャとインストールスクリプト | `sp_Blitz*.sql`, `Install-*.sql` |
| `Documentation/` | 各プロシージャのチェック項目ドキュメント | `*_Checks_by_Priority.md` |
| `Documentation/Development/` | 開発者向けドキュメント | `ReleaseProcess.md` |
| `Deprecated/` | サポート終了バージョン用スクリプト | 2005用、非推奨機能 |
| `.github/` | GitHub Actions、イシューテンプレート | `workflows/integration-tests.yml` |

---

## 5. アーキテクチャ

> このセクションでは、プロジェクトのアーキテクチャパターンを解説します。

### 5.1 全体アーキテクチャ

本プロジェクトは「診断ツールキット」パターンを採用しています。各ストアドプロシージャは独立して動作可能であり、必要に応じて相互に呼び出すことができます。

```
                    ┌─────────────────────────────────────┐
                    │         ユーザー/DBA                │
                    └─────────────────────────────────────┘
                                    │
                    ┌───────────────┼───────────────┐
                    ▼               ▼               ▼
            ┌───────────┐   ┌───────────┐   ┌───────────┐
            │ sp_Blitz  │   │sp_BlitzFirst│ │sp_BlitzIndex│
            │(健全性)   │   │(リアルタイム)│ │(インデックス)│
            └─────┬─────┘   └─────┬─────┘   └───────────┘
                  │               │
                  │         ┌─────┴─────┐
                  │         ▼           ▼
                  │   ┌──────────┐ ┌──────────┐
                  │   │sp_BlitzWho│ │sp_BlitzCache│
                  │   │(実行中)   │ │(キャッシュ)│
                  │   └──────────┘ └──────────┘
                  │
                  ▼
    ┌────────────────────────────────────────────┐
    │      SQL Server 動的管理ビュー（DMV）      │
    │  sys.dm_exec_*, sys.dm_os_*, sys.dm_io_*  │
    └────────────────────────────────────────────┘
                  │
                  ▼
    ┌────────────────────────────────────────────┐
    │         SQL Server インスタンス           │
    └────────────────────────────────────────────┘
```

### 5.2 レイヤー構成

| レイヤー | 責務 | 代表的なファイル |
|---------|------|-----------------|
| ユーザーインターフェース層 | パラメータ処理、ヘルプ表示、結果出力 | 各`sp_Blitz*.sql`の冒頭部分 |
| 検出ロジック層 | 問題の検出、分析、スコアリング | 各プロシージャの本体部分 |
| データアクセス層 | DMV/システムテーブルへのクエリ | 動的SQL生成部分 |
| 共通機能層 | 権限チェック、バージョン確認 | 各プロシージャ冒頭の共通処理 |

### 5.3 データフロー

1. **入力**: ユーザーがパラメータを指定してプロシージャを実行
2. **初期化**: 権限チェック、バージョン確認、一時テーブル作成
3. **診断実行**: DMVへのクエリ、結果の収集
4. **結果格納**: 一時テーブル（`#BlitzResults`等）に結果を挿入
5. **出力**: 結果を画面表示またはテーブルに保存

---

## 6. 主要コンポーネント

> このセクションでは、主要なコンポーネントとその連携を解説します。

### 6.1 エントリーポイント

各ストアドプロシージャは独立したエントリーポイントを持ちます:

```sql
-- ファイル: sp_Blitz.sql:36-39
AS
    SET NOCOUNT ON;
    SET STATISTICS XML OFF;
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
```

**共通の初期設定:**
- `SET NOCOUNT ON`: 行数メッセージ抑制
- `SET STATISTICS XML OFF`: 統計XML出力無効化
- `SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED`: 読み取りロック回避

### 6.2 ビジネスロジック

CheckIDベースの問題検出パターン:

```sql
-- ファイル: sp_Blitz.sql:762-778（概念例）
IF NOT EXISTS ( SELECT 1
                FROM #SkipChecks
                WHERE DatabaseName IS NULL AND CheckID = 204 )
BEGIN
    INSERT INTO #BlitzResults
    ( CheckID, Priority, FindingsGroup, Finding, URL, Details )
    SELECT 204 AS CheckID,
           0 AS Priority,
           'Informational' AS FindingsGroup,
           '@CheckUserDatabaseObjects Disabled' AS Finding,
           'https://www.BrentOzar.com/blitz/' AS URL,
           '...' AS Details;
END;
```

### 6.3 データアクセス

動的SQLによるデータベース間クエリ:

```sql
-- ファイル: sp_BlitzIndex.sql:187-192
SET @dsql = N'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
     SELECT @RowcountOUT = COUNT(1) FROM ' + QUOTENAME(@DatabaseName) + N'.[sys].[objects]
     WHERE [name] = @TableName_IN AND [type] IN (''U'',''V'') OPTION  (RECOMPILE);';
SET @params = N'@TableName_IN NVARCHAR(128), @RowcountOUT BIGINT OUTPUT';
EXEC sp_executesql @dsql, @params, @TableName_IN = @TableName, @RowcountOUT = @Rowcount OUTPUT;
```

### 6.4 ユーティリティ/共通機能

権限チェックの共通パターン:

```sql
-- ファイル: sp_Blitz.sql:260-285
IF
(
    SELECT
        sa =
            ISNULL
            (
                IS_SRVROLEMEMBER(N'sysadmin'),
                0
            )
) = 0
BEGIN
    IF @Debug IN (1, 2) RAISERROR('User not SA, checking permissions', 0, 1) WITH NOWAIT;

    SET @sa = 0;

    IF NOT EXISTS
    (
        SELECT
            1/0
        FROM sys.fn_my_permissions(NULL, NULL) AS fmp
        WHERE fmp.permission_name = N'VIEW SERVER STATE'
    )
    BEGIN
        RAISERROR('The user %s does not have VIEW SERVER STATE permissions.', 0, 11, @SUSER_NAME) WITH NOWAIT;
        RETURN;
    END;
END;
```

---

## 7. よく使われるパターン

> このセクションでは、コード内で頻出するパターンを解説します。

### パターン一覧

| パターン | 説明 | 出現頻度 | 代表的なファイル |
|---------|------|---------|-----------------|
| CheckID挿入パターン | 問題検出結果の挿入 | 高 | `sp_Blitz.sql` |
| SkipChecksパターン | 特定チェックのスキップ | 高 | `sp_Blitz.sql` |
| 動的SQLパターン | データベース間クエリ | 高 | `sp_BlitzIndex.sql` |
| バージョン分岐パターン | SQL Serverバージョン別処理 | 中 | 全ファイル |
| 出力テーブルパターン | 結果の永続化 | 中 | `sp_BlitzFirst.sql` |

### 各パターンの詳細

#### パターン1: CheckID挿入パターン

**目的:** 検出された問題を一貫した形式で結果テーブルに挿入

**実装例:**
```sql
-- ファイル: sp_Blitz.sql:682-696
INSERT INTO #BlitzResults
( CheckID ,
  Priority ,
  FindingsGroup ,
  Finding ,
  URL ,
  Details
)
SELECT 223 AS CheckID ,
         0 AS Priority ,
         'Informational' AS FindingsGroup ,
         'Some Checks Skipped' AS Finding ,
         '' AS URL ,
         'User ''' + @SUSER_NAME + ''' is not part of the sysadmin role...' AS Details;
```

**解説:** 各CheckIDは`Documentation/sp_Blitz_Checks_by_Priority.md`で文書化されています。

#### パターン2: SkipChecksパターン

**目的:** 特定のチェックをスキップする柔軟性を提供

**実装例:**
```sql
-- ファイル: sp_Blitz.sql:558-566
IF OBJECT_ID('tempdb..#SkipChecks') IS NOT NULL
    DROP TABLE #SkipChecks;
CREATE TABLE #SkipChecks
    (
      DatabaseName NVARCHAR(128) ,
      CheckID INT ,
      ServerName NVARCHAR(128)
    );
CREATE CLUSTERED INDEX IX_CheckID_DatabaseName ON #SkipChecks(CheckID, DatabaseName);
```

**解説:** ユーザーは外部テーブルでスキップするチェックを指定可能。

#### パターン3: 動的SQLパターン

**目的:** 異なるデータベースコンテキストでのクエリ実行

**実装例:**
```sql
-- ファイル: sp_BlitzFirst.sql:224-236
SET @StringToExecute = N' IF EXISTS(SELECT * FROM '
    + @OutputDatabaseName
    + '.INFORMATION_SCHEMA.SCHEMATA WHERE QUOTENAME(SCHEMA_NAME) = '''
    + @OutputSchemaName + ''') INSERT '
    + @OutputDatabaseName + '.'
    + @OutputSchemaName + '.'
    + @OutputTableName
    + ' (ServerName, CheckDate, CheckID, ...) VALUES( ... )';

EXECUTE sp_executesql @StringToExecute, ...;
```

**解説:** `QUOTENAME()`でSQLインジェクション対策を実施。

#### パターン4: バージョン分岐パターン

**目的:** SQL Serverのバージョンに応じた処理分岐

**実装例:**
```sql
-- ファイル: sp_BlitzCache.sql:11-24
IF (
SELECT
  CASE
     WHEN CONVERT(NVARCHAR(128), SERVERPROPERTY ('PRODUCTVERSION')) LIKE '8%' THEN 0
     WHEN CONVERT(NVARCHAR(128), SERVERPROPERTY ('PRODUCTVERSION')) LIKE '9%' THEN 0
     ELSE 1
  END
) = 0
BEGIN
    DECLARE @msg VARCHAR(8000);
    SELECT @msg = 'Sorry, sp_BlitzCache doesn''t work on versions of SQL prior to 2008.' + REPLICATE(CHAR(13), 7933);
    PRINT @msg;
    RETURN;
END;
```

---

## 8. 業務フロー追跡の実践例

> このセクションでは、実際の業務フローをコードで追跡する方法を解説します。

### 8.1 フロー追跡の基本手順

1. エントリーポイントを特定
2. 処理の流れを追跡（呼び出し関係を追う）
3. データの変換を確認
4. 最終的な出力を確認

### 8.2 フロー追跡の実例

#### 例1: sp_Blitzの実行フロー

**概要:** サーバーの健全性チェックを実行し、問題を優先度付きで報告

**処理フロー:**
```
パラメータ処理 → 権限チェック → 一時テーブル作成 → 各種チェック実行 → 結果出力
```

**詳細な追跡:**

1. **パラメータ処理** (`sp_Blitz.sql:5-35`)
   ```sql
   ALTER PROCEDURE [dbo].[sp_Blitz]
       @Help TINYINT = 0 ,
       @CheckUserDatabaseObjects TINYINT = 1 ,
       ...
   ```

2. **バージョン設定** (`sp_Blitz.sql:42`)
   ```sql
   SELECT @Version = '8.29', @VersionDate = '20260203';
   ```

3. **ヘルプ処理** (`sp_Blitz.sql:50-122`)
   ```sql
   IF @Help = 1
   BEGIN
       PRINT '...'
       RETURN;
   END;
   ```

4. **権限チェック** (`sp_Blitz.sql:260-285`)
   ```sql
   IF (SELECT sa = ISNULL(IS_SRVROLEMEMBER(N'sysadmin'), 0)) = 0
   BEGIN
       -- 権限確認ロジック
   END;
   ```

5. **一時テーブル作成** (`sp_Blitz.sql:480-494`)
   ```sql
   CREATE TABLE #BlitzResults ( ... );
   ```

6. **各種チェック実行**（多数のチェックが順次実行）

7. **結果出力**（最終的に`#BlitzResults`から結果をSELECT）

### 8.3 フロー追跡チェックリスト

- [ ] エントリーポイントを特定したか
- [ ] 呼び出し関係を把握したか
- [ ] データの変換ポイントを確認したか
- [ ] エラーハンドリングを確認したか
- [ ] 最終的な出力を確認したか

---

## 9. 設計書の参照順序

> このセクションでは、プロジェクト理解のための設計書参照順序を案内します。

### 9.1 目的別ロードマップ

#### 全体像を把握したい場合
1. `README.md` - プロジェクト概要、各プロシージャの機能説明
2. `CONTRIBUTING.md` - 開発ガイドライン
3. 各プロシージャの`@Help = 1`出力

#### 特定機能を理解したい場合
1. 対象プロシージャの`@Help = 1`出力
2. `Documentation/sp_*_Checks_by_Priority.md`
3. 該当ソースコード

#### 改修作業を行う場合
1. `CONTRIBUTING.md`
2. `Documentation/Development/ReleaseProcess.md`
3. 対象ソースコード
4. `.github/workflows/integration-tests.yml`

### 9.2 ドキュメント一覧

| ドキュメント | 概要 | 参照タイミング |
|-------------|------|---------------|
| `README.md` | プロジェクト概要、使用方法 | 最初に参照 |
| `CONTRIBUTING.md` | 貢献ガイドライン | 開発参加時 |
| `LICENSE.md` | MITライセンス | 利用条件確認時 |
| `CODE_OF_CONDUCT.md` | 行動規範 | コミュニティ参加時 |
| `sp_*_Checks_by_Priority.md` | チェック項目詳細 | 特定チェック調査時 |
| `Development/ReleaseProcess.md` | リリースプロセス | リリース作業時 |

---

## 10. トラブルシューティング

> このセクションでは、コードリーディング時によくある問題と解決法を解説します。

### よくある疑問と回答

#### Q: CheckIDの意味がわからない
A: `Documentation/sp_Blitz_Checks_by_Priority.md`を参照。CheckIDは問題の種類を一意に識別するIDで、優先度（Priority）と関連付けられています。

#### Q: 動的SQLが複雑で追いにくい
A: `@Debug = 2`パラメータを使用すると、生成された動的SQLが出力されます。
```sql
EXEC sp_Blitz @Debug = 2;
```

#### Q: 一時テーブルの構造を確認したい
A: ソースコード内の`CREATE TABLE #*`を検索するか、デバッグモードで実行中に`SELECT * FROM #TableName`を実行。

#### Q: 特定のバージョンで動作が異なる
A: `SERVERPROPERTY('ProductVersion')`による分岐を検索。バージョン依存の処理は`@ProductVersionMajor`変数で制御されることが多い。

### デバッグのヒント

1. **@Debug パラメータの活用**
   - `@Debug = 1`: 処理ステップのメッセージ出力
   - `@Debug = 2`: 動的SQLも出力

2. **RAISERROR によるデバッグポイント**
   ```sql
   RAISERROR('Starting run. %s', 0,1, @ScriptVersionName) WITH NOWAIT;
   ```

3. **一時テーブルの確認**
   - `#BlitzResults`, `#SkipChecks`などの中間結果を確認

---

## 付録

### A. 用語集

| 用語 | 説明 |
|-----|------|
| DMV | Dynamic Management View - SQL Serverの動的管理ビュー |
| CheckID | 検出項目を一意に識別するID |
| Priority | 問題の優先度（1が最高、数字が大きいほど低優先） |
| FindingsGroup | 問題のカテゴリ（Backup, Security, Performance等） |
| SPID | Server Process ID - SQL Serverセッション識別子 |
| VLF | Virtual Log File - トランザクションログの論理単位 |
| TDE | Transparent Data Encryption - 透過的データ暗号化 |
| DAC | Dedicated Administrator Connection - 専用管理者接続 |

### B. ファイル一覧

| ファイル/ディレクトリ | 説明 | 主な内容 |
|---------------------|------|---------|
| `sp_Blitz.sql` | 健全性チェック | サーバー設定、セキュリティ、パフォーマンス問題の検出 |
| `sp_BlitzCache.sql` | クエリキャッシュ分析 | リソース消費の多いクエリの特定 |
| `sp_BlitzFirst.sql` | リアルタイム診断 | 現在発生中のパフォーマンス問題の診断 |
| `sp_BlitzIndex.sql` | インデックス分析 | インデックス設計の問題、欠落インデックスの検出 |
| `sp_BlitzLock.sql` | デッドロック分析 | デッドロック履歴の解析 |
| `sp_BlitzWho.sql` | 実行中クエリ | 現在実行中のクエリの詳細表示 |
| `sp_BlitzAnalysis.sql` | 履歴分析 | BlitzFirst出力テーブルの分析 |
| `sp_BlitzBackups.sql` | バックアップ分析 | RPO/RTO推定、バックアップ状況確認 |
| `sp_DatabaseRestore.sql` | リストア支援 | Ola Hallengren形式バックアップのリストア |
| `sp_ineachdb.sql` | ユーティリティ | 各データベースでコマンド実行 |

### C. 参考資料

- [Brent Ozar Unlimited - First Responder Kit](https://www.brentozar.com/first-aid/)
- [GitHub リポジトリ](https://github.com/BrentOzarULTD/SQL-Server-First-Responder-Kit)
- [Microsoft Docs - T-SQL Reference](https://docs.microsoft.com/en-us/sql/t-sql/language-reference)
- [Microsoft Docs - Dynamic Management Views](https://docs.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/system-dynamic-management-views)
- [SQLCommunity Slack - #FirstResponderKit チャンネル](https://sqlcommunity.slack.com/messages/firstresponderkit/)
