# 画面設計書 105-TempDB設定

## 概要

本ドキュメントは、dbatools PowerShellモジュールにおけるSQL ServerのTempDB設定管理機能（Test-DbaTempDbConfig、Set-DbaTempDbConfig）の設計仕様を記載する。

### 本画面の処理概要

SQL ServerのTempDBデータベースの設定をMicrosoftベストプラクティスに照らしてテストし、最適な構成に変更するためのコマンドラインインターフェースを提供する。TempDBの構成はSQL Serverのパフォーマンスに直接影響するため、適切な設定が重要である。

**業務上の目的・背景**：TempDBはSQL Serverのワークスペースとして頻繁に使用され、その構成がパフォーマンスに大きな影響を与える。ファイル数、ファイルサイズの均等性、増分設定、ファイル配置場所などの設定が不適切だと、競合やボトルネックが発生する。本機能により、TempDBの構成監査と最適化を自動化し、パフォーマンス問題の予防・解決を効率化できる。

**画面へのアクセス方法**：PowerShellコンソールから `Test-DbaTempDbConfig` または `Set-DbaTempDbConfig` コマンドを実行する。

**主要な操作・処理内容**：
1. TempDBのテスト（Test-DbaTempDbConfig）：6つのベストプラクティスルールに対する準拠状況をテスト
2. トレースフラグ1118（TF 1118 Enabled）：SQL Server 2014以前で推奨されるトレースフラグの状態確認
3. ファイル数（File Count）：論理コア数に基づく推奨ファイル数との比較
4. ファイル増分（File Growth in Percent）：パーセント増分の有無確認
5. ファイル配置（File Location）：C:ドライブへの配置確認
6. TempDBの設定（Set-DbaTempDbConfig）：データファイル数、サイズ、パスの構成

**画面遷移**：Test-DbaTempDbConfigの結果を確認後、Set-DbaTempDbConfigで構成を最適化する流れ。設定変更後はSQL Serverサービスの再起動が必要。

**権限による表示制御**：両コマンドともSQL Server接続権限が必要。Set-DbaTempDbConfigはTempDBの変更権限が必要。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 254 | Test-DbaTempDbConfig | 主機能 | TempDB設定のテスト |
| 231 | Set-DbaTempDbConfig | 主機能 | TempDB設定の変更 |

## 画面種別

コマンドラインインターフェース（テスト・設定）

## URL/ルーティング

PowerShellコマンド実行

## 入出力項目

### Test-DbaTempDbConfig パラメータ

| パラメータ名 | 型 | 必須 | 説明 |
|-------------|-----|------|------|
| SqlInstance | DbaInstance[] | 必須 | 対象SQL Serverインスタンス |
| SqlCredential | PSCredential | 任意 | SQL認証情報 |
| EnableException | Switch | 任意 | 例外を有効にする |

### Set-DbaTempDbConfig パラメータ

| パラメータ名 | 型 | 必須 | 説明 |
|-------------|-----|------|------|
| SqlInstance | DbaInstanceParameter[] | 必須 | 対象SQL Serverインスタンス |
| SqlCredential | PSCredential | 任意 | SQL認証情報 |
| DataFileCount | int | 任意 | データファイル数（省略時は論理コア数、最大8） |
| DataFileSize | int | 必須 | 全データファイル合計サイズ（MB） |
| LogFileSize | int | 任意 | ログファイルサイズ（MB） |
| DataFileGrowth | int | 任意 | データファイル増分（MB、既定512） |
| LogFileGrowth | int | 任意 | ログファイル増分（MB、既定512） |
| DataPath | string[] | 任意 | データファイル配置パス |
| LogPath | string | 任意 | ログファイル配置パス |
| OutFile | string | 任意 | SQLスクリプト出力先ファイル |
| OutputScriptOnly | Switch | 任意 | SQLスクリプトのみ出力 |
| DisableGrowth | Switch | 任意 | ファイル増分を無効化 |
| EnableException | Switch | 任意 | 例外を有効にする |

## 表示項目

### Test-DbaTempDbConfig 出力プロパティ

| プロパティ名 | 型 | 説明 |
|-------------|-----|------|
| ComputerName | string | コンピュータ名 |
| InstanceName | string | インスタンス名 |
| SqlInstance | string | 完全なインスタンス名 |
| Rule | string | ルール名（6種類） |
| Recommended | bool/int | 推奨値 |
| CurrentSetting | bool/int | 現在の設定値 |
| IsBestPractice | bool | ベストプラクティス準拠 |
| Notes | string | 説明・推奨事項 |

### Set-DbaTempDbConfig 出力プロパティ

| プロパティ名 | 型 | 説明 |
|-------------|-----|------|
| ComputerName | string | コンピュータ名 |
| InstanceName | string | インスタンス名 |
| SqlInstance | string | 完全なインスタンス名 |
| DataFileCount | int | データファイル数 |
| DataFileSize | dbasize | 全データファイル合計サイズ |
| SingleDataFileSize | dbasize | 個別データファイルサイズ |
| LogSize | dbasize | ログファイルサイズ |
| DataPath | string/string[] | データファイルパス |
| LogPath | string | ログファイルパス |
| DataFileGrowth | dbasize | データファイル増分 |
| LogFileGrowth | dbasize | ログファイル増分 |

## イベント仕様

### 1-Test-DbaTempDbConfig実行

1. Connect-DbaInstance（MinimumVersion 9）で接続
2. DBCC TRACESTATUSでトレースフラグ1118の状態確認
3. Get-DbaDbFileでTempDBファイル情報取得
4. 6つのルールに対してPSCustomObjectを出力：
   - TF 1118 Enabled（SQL 2016以上は常にtrue）
   - File Count（論理コア数との比較、最大8）
   - File Growth in Percent（KBベース推奨）
   - File Location（C:ドライブ以外推奨）
   - File MaxSize Set（無制限推奨）
   - Data File Size Equal（均等サイズ推奨）

### 2-Set-DbaTempDbConfig実行

1. 論理コア数取得（最大8にキャップ）
2. DataFileCount未指定時は論理コア数を使用
3. DataFileSizeをDataFileCountで除算して個別サイズ計算
4. DataPath/LogPathの存在確認（Test-DbaPath）
5. 現在のTempDBファイル数・サイズとの整合性確認
6. ALTER DATABASEステートメント生成
7. OutputScriptOnly時はSQLを返却、OutFile時はファイル出力
8. それ以外はExecuteNonQueryで実行

## データベース更新仕様

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| Test-DbaTempDbConfig | sys.traces, sys.database_files | SELECT | TempDB構成情報の読み取り |
| Set-DbaTempDbConfig | tempdb | ALTER DATABASE | TempDBファイル構成の変更 |

### テーブル別更新項目詳細

#### TempDBファイル構成（Set-DbaTempDbConfig）

| 操作 | 項目 | 更新値・取得条件 | 備考 |
|-----|-----|-----------------|------|
| MODIFY FILE | filename | 新パス | ファイル移動 |
| MODIFY FILE | size | 計算されたサイズ（MB） | サイズ変更 |
| MODIFY FILE | filegrowth | 指定増分（MB） | 増分設定 |
| ADD FILE | name, filename, size, filegrowth | 新ファイル設定 | ファイル追加 |

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 発生条件 |
|-------------|------|--------------|----------|
| MSG001 | エラー | "Current tempdb in $instance is not suitable to be reconfigured. The current tempdb has a greater number of files ($CurrentFileCount) than the calculated configuration ($DataFileCount)." | 現在のファイル数が目標より多い場合 |
| MSG002 | エラー | "Current tempdb in $instance is not suitable to be reconfigured. The current tempdb has files with a size ($TooBigCount MB) larger than the calculated individual file configuration ($DataFilesizeSingle MB)." | 現在のファイルサイズが目標より大きい場合 |
| MSG003 | 警告 | "Data File Count of $DataFileCount exceeds the Logical Core Count of $cores. This is outside of best practices." | 指定ファイル数が論理コア数を超過 |
| MSG004 | 出力 | "tempdb reconfigured. You must restart the SQL Service for settings to take effect." | 設定変更完了時 |
| MSG005 | エラー | "$dataDirPath does not exist" | 指定パスが存在しない場合 |

## 例外処理

| 例外条件 | 処理内容 |
|---------|---------|
| 接続失敗 | Stop-Functionでエラー出力し、Continueで次のインスタンスへ |
| 現在ファイル数が目標超過 | Stop-Functionでエラー出力し、Continueで次のインスタンスへ |
| 現在ファイルサイズが目標超過 | Stop-Functionでエラー出力し、Continueで次のインスタンスへ |
| パス不存在 | Stop-Functionでエラー出力し、Continueで次のインスタンスへ |
| SQL実行エラー | Stop-Functionでエラー出力し、Continueで次のインスタンスへ |

## 備考

- SQL Server 2016以上ではトレースフラグ1118は不要（既定で有効）
- ファイル数は論理コア数を超えないことが推奨（最大8）
- 設定変更はサービス再起動まで反映されない
- 既存ファイルの縮小・削除は行わない
- DataPathに複数パスを指定すると、ラウンドロビンでファイルを配置
- MinimumVersion 9（SQL Server 2005以上）が必要

---

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

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

### 推奨読解順序

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

テスト結果オブジェクトの構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Test-DbaTempDbConfig.ps1 | `public/Test-DbaTempDbConfig.ps1` | 6つのルール出力オブジェクトの構造（行112-132, 143-152, 167-176, 188-197, 209-218, 231-240）を確認 |

**読解のコツ**: 各ルールのRecommendedとIsBestPracticeの判定ロジックを理解する

#### Step 2: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Test-DbaTempDbConfig.ps1 | `public/Test-DbaTempDbConfig.ps1` | param()ブロック（行93-98）でパラメータ定義を確認 |
| 2-2 | Set-DbaTempDbConfig.ps1 | `public/Set-DbaTempDbConfig.ps1` | param()ブロック（行138-154）でパラメータ定義を確認 |

**主要処理フロー**:
1. **行102**: Connect-DbaInstance（MinimumVersion 9）
2. **行108-109**: DBCC TRACESTATUSでTF1118確認
3. **行138-141**: Get-DbaDbFileでTempDBファイル情報取得

#### Step 3: ベストプラクティステストロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Test-DbaTempDbConfig.ps1 | `public/Test-DbaTempDbConfig.ps1` | 各ルールの評価ロジック（行111-241） |

**主要処理フロー**:
- **行111-133**: TF 1118評価（バージョンによる分岐）
- **行143-152**: File Count評価（Math.Minで8にキャップ）
- **行156-176**: File Growth評価（GrowthType != KB）
- **行179-197**: File Location評価（C:で始まるパス検出）
- **行201-218**: File MaxSize評価（MaxSize > 0）
- **行222-240**: Data File Size Equal評価（Group-Object）

#### Step 4: TempDB設定ロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | Set-DbaTempDbConfig.ps1 | `public/Set-DbaTempDbConfig.ps1` | ファイル構成変更ロジック（行155-317） |

**主要処理フロー**:
- **行163-177**: DataFileCount決定（論理コア数ベース）
- **行179**: 個別ファイルサイズ計算（Math.Floor）
- **行216-226**: 現在構成との整合性確認
- **行236-262**: ALTER DATABASE文生成（MODIFY FILE / ADD FILE）
- **行286-314**: 実行またはスクリプト出力

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

```
Test-DbaTempDbConfig
    |
    +-- Connect-DbaInstance -MinimumVersion 9
    |
    +-- $server.Query("DBCC TRACESTATUS")
    |      +-- TraceFlag 1118確認
    |
    +-- Get-DbaDbFile -Database tempdb
    |      |
    |      +-- dataFiles (Type != 1)
    |      +-- logFiles (Type == 1)
    |
    +-- 6つのルール評価
           |
           +-- TF 1118 Enabled (バージョン分岐)
           +-- File Count (Math.Min(8, Processors))
           +-- File Growth in Percent (GrowthType)
           +-- File Location (PhysicalName -like 'C:*')
           +-- File MaxSize Set (MaxSize > 0)
           +-- Data File Size Equal (Group-Object Size)

Set-DbaTempDbConfig
    |
    +-- Connect-DbaInstance -MinimumVersion 9
    |
    +-- DataFileCount決定
    |      +-- 論理コア数取得 ($server.Processors)
    |      +-- 最大8にキャップ
    |
    +-- パス検証
    |      +-- Test-DbaPath (DataPath)
    |      +-- Test-DbaPath (LogPath)
    |
    +-- 現在構成検証
    |      +-- ファイル数チェック
    |      +-- ファイルサイズチェック
    |
    +-- Get-DbaDbFile -Database tempdb
    |
    +-- ALTER DATABASE文生成
    |      +-- MODIFY FILE (既存ファイル)
    |      +-- ADD FILE (新規ファイル)
    |
    +-- 出力分岐
           +-- OutputScriptOnly -> SQL返却
           +-- OutFile -> ファイル出力
           +-- 通常 -> ExecuteNonQuery
```

### データフロー図

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

SqlInstance ──────▶ Connect-DbaInstance ──────▶ SMO Server Object
                           |
                           v
                    DBCC TRACESTATUS
                           |
                           v
                    TraceFlag 1118状態
                           |
                           v
                    Get-DbaDbFile
                           |
                           v
                    DataFiles / LogFiles
                           |
                           v
                    各ルール評価
                           |
                           v
                    PSCustomObject ──────▶ 6つのテスト結果

DataFileSize ──────▶ サイズ計算
DataFileCount          |
                       v
               SingleDataFileSize
                       |
                       v
               ALTER DATABASE生成 ──────▶ SQL Script / 実行結果
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Test-DbaTempDbConfig.ps1 | `public/Test-DbaTempDbConfig.ps1` | ソース | TempDB構成テスト |
| Set-DbaTempDbConfig.ps1 | `public/Set-DbaTempDbConfig.ps1` | ソース | TempDB構成設定 |
| Get-DbaDbFile.ps1 | `public/Get-DbaDbFile.ps1` | ソース | データベースファイル情報取得 |
| Test-DbaPath.ps1 | `public/Test-DbaPath.ps1` | ソース | パス存在確認 |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | SQL Server接続 |
