# 画面設計書：29-データベース圧縮

## 1. 基本情報

| 項目 | 内容 |
|------|------|
| 画面ID | 29 |
| 画面名 | データベース圧縮 |
| カテゴリ | データベース |
| 対応コマンド | Get-DbaDbCompression |
| 関連機能No | 113 |

## 2. 概要・目的

テーブルとインデックスの圧縮設定、サイズ、行数を取得する機能です。データ圧縮の使用状況を分析し、圧縮候補の特定やストレージ節約、圧縮使用状況のコンプライアンスレポート生成に使用します。

ヒープ、クラスター化インデックス、非クラスター化インデックスの物理パーティションごとに圧縮情報を返します。

## 3. 機能説明

### 3.1 圧縮タイプ

| タイプ | 説明 |
|--------|------|
| None | 圧縮なし |
| Row | 行圧縮 |
| Page | ページ圧縮 |
| ColumnStore | 列ストア圧縮 |

### 3.2 分析対象

| 対象 | 説明 |
|------|------|
| Heap | ヒープテーブル（クラスター化インデックスなし） |
| ClusteredIndex | クラスター化インデックス |
| NonClusteredIndex | 非クラスター化インデックス |

### 3.3 要件

- **SQL Server 2008以上必須**: MinimumVersion 10を指定

## 4. パラメータ仕様

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|------|-------------|------|
| SqlInstance | DbaInstanceParameter[] | Yes | - | 対象SQLインスタンス |
| SqlCredential | PSCredential | No | - | 認証資格情報 |
| Database | string[] | No | - | 対象データベース |
| ExcludeDatabase | string[] | No | - | 除外データベース |
| Table | string[] | No | - | 対象テーブル |
| EnableException | switch | No | $false | 例外を有効化 |

## 5. 出力仕様

**型**: PSCustomObject

| プロパティ | 型 | 説明 |
|-----------|-----|------|
| ComputerName | string | コンピュータ名 |
| InstanceName | string | インスタンス名 |
| SqlInstance | string | 完全修飾インスタンス名 |
| Database | string | データベース名 |
| DatabaseId | int | データベースID |
| Schema | string | スキーマ名 |
| TableName | string | テーブル名 |
| IndexName | string | インデックス名（ヒープはNULL） |
| Partition | int | パーティション番号 |
| IndexID | int | インデックスID（0=ヒープ） |
| IndexType | string | インデックスタイプ（Heap/ClusteredIndex/NonClusteredIndex等） |
| DataCompression | string | 圧縮タイプ（None/Row/Page/ColumnStore） |
| SizeCurrent | dbasize | 現在サイズ |
| RowCount | long | 行数 |

## 6. 処理フロー

```
[開始]
    |
    v
[Connect-DbaInstance]
    | - MinimumVersion 10（SQL 2008以上）
    v
[データベースフィルタ]
    | - IsAccessible = true
    | - IsSystemObject = false
    | - Database/ExcludeDatabase適用
    v
[テーブルループ]
    |
    v
[ヒープ処理]
    | - HasHeapIndex = true の場合
    | - PhysicalPartitionsループ
    v
[インデックス処理]
    | - Indexesループ
    | - PhysicalPartitionsループ
    v
[PSCustomObject出力]
    |
    v
[終了]
```

## 7. 内部実装詳細

### 7.1 バージョン要件

```powershell
# Get-DbaDbCompression.ps1 行103
$server = Connect-DbaInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 10
```

### 7.2 データベースフィルタ

```powershell
# Get-DbaDbCompression.ps1 行109-117
$dbs = $server.Databases | Where-Object { $_.IsAccessible -and $_.IsSystemObject -eq 0 }

if ($Database) {
    $dbs = $dbs | Where-Object { $_.Name -In $Database }
}

if ($ExcludeDatabase) {
    $dbs = $dbs | Where-Object { $_.Name -NotIn $ExcludeDatabase }
}
```

### 7.3 ヒープ処理

```powershell
# Get-DbaDbCompression.ps1 行131-149
if ($obj.HasHeapIndex) {
    foreach ($p in $obj.PhysicalPartitions) {
        [PSCustomObject]@{
            ComputerName    = $server.ComputerName
            ...
            IndexName       = $null
            IndexID         = 0
            IndexType       = "Heap"
            DataCompression = $p.DataCompression
            SizeCurrent     = [dbasize]($obj.DataSpaceUsed * 1024)
            RowCount        = $obj.RowCount
        }
    }
}
```

### 7.4 インデックス処理

```powershell
# Get-DbaDbCompression.ps1 行152-171
foreach ($index in $obj.Indexes) {
    foreach ($p in $index.PhysicalPartitions) {
        [PSCustomObject]@{
            ...
            IndexName       = $index.Name
            IndexID         = $index.ID
            IndexType       = $index.IndexType
            DataCompression = $p.DataCompression
            SizeCurrent     = if ($index.IndexType -eq "ClusteredIndex") {
                [dbasize]($obj.DataSpaceUsed * 1024)
            } else {
                [dbasize]($index.SpaceUsed * 1024)
            }
            RowCount        = $p.RowCount
        }
    }
}
```

### 7.5 サイズ計算

| 対象 | 計算式 |
|------|--------|
| ヒープ | $obj.DataSpaceUsed * 1024 |
| ClusteredIndex | $obj.DataSpaceUsed * 1024（テーブルデータ） |
| 非クラスター化インデックス | $index.SpaceUsed * 1024 |

## 8. 使用例

### 8.1 基本的な使用

```powershell
# 全ユーザーデータベースの圧縮設定を取得
Get-DbaDbCompression -SqlInstance localhost
```

### 8.2 特定データベースの指定

```powershell
# 特定データベースの圧縮設定を取得
Get-DbaDbCompression -SqlInstance localhost -Database TestDatabase
```

### 8.3 除外データベースの指定

```powershell
# 特定データベースを除外して取得
Get-DbaDbCompression -SqlInstance localhost -ExcludeDatabase TestDatabases
```

### 8.4 特定テーブルの指定

```powershell
# 特定テーブルの圧縮設定を取得
Get-DbaDbCompression -SqlInstance localhost -ExcludeDatabase TestDatabases -Table table1, table2
```

## 9. エラーハンドリング

| エラー状況 | 処理 | ソース位置 |
|-----------|------|-----------|
| 接続失敗 | Stop-Function -Continue | Get-DbaDbCompression.ps1 行104-106 |
| データベース列挙失敗 | Stop-Function -Continue | Get-DbaDbCompression.ps1 行118-120 |
| テーブルクエリ失敗 | Stop-Function -Continue | Get-DbaDbCompression.ps1 行174-176 |

## 10. 関連コマンド

| コマンド | 関係 | 説明 |
|---------|------|------|
| Set-DbaDbCompression | 関連 | 圧縮設定を変更 |
| Test-DbaDbCompression | 関連 | 圧縮効果をテスト |

## 11. 注意事項・制約

1. **SQL Server 2008以上**: MinimumVersion 10により2008未満はエラー
2. **システムDB除外**: IsSystemObject = falseでフィルタ
3. **アクセス可能DB限定**: IsAccessible = trueでフィルタ
4. **SMO依存**: Table.PhysicalPartitions/Index.PhysicalPartitionsを使用
5. **パーティション単位**: 各パーティションごとに結果を返す
6. **dbasize型**: SizeCurrentはdbasizeオブジェクト（自動単位変換）

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

### 12.1 関連ファイル一覧

| ファイル | 種類 | 行数 | 説明 |
|---------|------|------|------|
| public/Get-DbaDbCompression.ps1 | メインコマンド | 180 | 圧縮設定取得 |

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

```
Get-DbaDbCompression
    |
    +-- Connect-DbaInstance (MinimumVersion 10, 行103)
    +-- $server.Databases (データベース一覧, 行109)
    +-- $db.Tables (テーブル一覧, 行124)
    +-- $obj.PhysicalPartitions (ヒープパーティション, 行132)
    +-- $index.PhysicalPartitions (インデックスパーティション, 行153)
```

### 12.3 データフロー図

```
[SqlInstance]
    |
    v
[Connect-DbaInstance -MinimumVersion 10]
    |
    v
[$server.Databases]
    |
    | IsAccessible & !IsSystemObject フィルタ
    | Database/ExcludeDatabase フィルタ
    v
[データベースループ]
    |
    v
[$db.Tables]
    |
    | Table フィルタ（オプション）
    v
[テーブルループ]
    |
    +-- HasHeapIndex = true --> PhysicalPartitions --> Heap出力
    |
    +-- $obj.Indexes --> PhysicalPartitions --> Index出力
    |
    v
[PSCustomObject出力]
    |
    | DataCompression（None/Row/Page/ColumnStore）
    | SizeCurrent（dbasize）
    | RowCount
    v
[出力]
```

### 12.4 読み解きの流れ

1. **processブロック インスタンスループ (行100-179)**
   - Connect-DbaInstance（行102-106）
   - データベースフィルタ（行108-120）

2. **データベースループ (行122-177)**
   - テーブル取得とフィルタ（行124-128）
   - ヒープ処理（行131-150）
   - インデックス処理（行152-171）

## 13. 改訂履歴

| 日付 | バージョン | 変更内容 |
|------|-----------|---------|
| 2026-02-18 | 1.0 | 初版作成 |
