デルタ テーブル ファイルは、時間の経過と同時に断片化されます。 断片化により、ファイル操作のオーバーヘッドが増加し、圧縮効率が低下し、リーダーの並列処理が制限される可能性があります。 圧縮により、多数の小さなファイルが適切なサイズのファイルに書き換わるため、Spark はデータの読み取りと処理をより効率的に行うことができます。
OPTIMIZE コマンドは、主要な圧縮操作です。 小さなファイルを理想的なファイル サイズをターゲットとするビンにグループ化し、ストレージに書き換えます。
SQL Analytics エンドポイント、Power BI Direct Lake、Spark 全体の圧縮戦略に関するワークロード間のガイダンスについては、 ワークロード間のテーブルのメンテナンスと最適化に関するページを参照してください。
圧縮方法
Microsoft Fabric には、Delta テーブルで最適なファイル サイズを維持するためのいくつかの方法が用意されています。
OPTIMIZE コマンド
OPTIMIZE コマンドは、Delta テーブルを圧縮するための基本的な操作です。 デルタ テーブルのデータ レイアウトを向上させるために、小さなファイルを大きなファイルに書き換えます。
| プロパティ | Description | 既定値 | セッション構成 |
|---|---|---|---|
| minFileSize | このしきい値より小さいファイルはグループ化され、大きなファイルとして書き換えられます。 | 1073741824 (1g) | spark.databricks.delta.optimize.minFileSize |
| maxFileSize |
OPTIMIZE コマンドによって生成されるターゲット ファイル サイズ。 |
1073741824 (1g) | spark.databricks.delta.optimize.maxFileSize |
OPTIMIZE はべき等ですが、特大の minFileSize では書き込み増幅が増加する可能性があります。 たとえば、 minFileSize 1 GB に設定すると、小さな書き込み後に 900 MB のファイルが書き換えられる場合があります。 ファイル サイズの自動管理ガイダンスについては、 アダプティブ ターゲット ファイル サイズに関するページを参照してください。
OPTIMIZE Z オーダー付き
ZORDER BY句を使用すると、OPTIMIZEはアクティブ なファイルを書き換えて、同じファイル内に類似した値を持つ行が併置されるようにします。 これにより、選択的フィルターのファイル スキップが向上します。 Z オーダーは次の場合に使用します。
- クエリでは、多くの場合、2 つ以上の列 (日付 + customer_idなど) をフィルター処理します。
- これらの述語は十分に選択的であるため、ファイル レベルのスキップがスキャンされるファイルの数を減少させます。
OPTIMIZE dbo.table_name ZORDER BY (column1, column2)
OPTIMIZE V-オーダー付き
VORDER句を指定すると、圧縮対象のファイルに V オーダー最適化が適用されます。 V オーダーの詳細については、詳細な ドキュメントを参照してください。
OPTIMIZE dbo.table_name VORDER
OPTIMIZE 液体クラスタリングを搭載
液体クラスタリングはテーブルオプションとして指定されています。詳細については、 液体クラスタリングの有効化 を参照してください。 液体クラスタリングが有効になっている場合、 OPTIMIZE はクラスタリング ポリシーを適用する物理書き換えを実行します。
Important
データは、 OPTIMIZE が液体クラスター化対応テーブルで実行されている場合にのみクラスター化されます。 通常の書き込み操作では、データはクラスター化されません。 自動圧縮の使用や最適化ジョブの手動スケジューリングなどの圧縮戦略を使用することは、クラスター化されたデータの利点 (つまり、デルタ ファイルのスキップの改善) を実現するために不可欠です。
高速最適化
高速最適化では、Delta テーブル ファイルをインテリジェントに分析し、パフォーマンスを有意に向上させる可能性が高くない圧縮操作をスキップします。
小さなファイルが存在するたびにファイルを盲目的に圧縮する代わりに、高速最適化では、各候補ビン (小さなファイルのグループ) が構成可能なベスト プラクティスの圧縮目標を満たしているかどうかを評価します。 高速最適化では、マージがターゲットの最小サイズに達する可能性がある場合、または小さなファイルが多すぎる場合にのみ、ファイルのビンに圧縮が実行されます。 それ以外の場合は、そのグループをスキップするか、圧縮するファイルの数を減らします。
高速最適化は、圧縮の期待に基づいて微調整できます。
| プロパティ | Description | 既定値 | セッション構成 |
|---|---|---|---|
| minNumFiles | 最適化されたファイルを生成するのに十分なデータがビンに含まれていない場合に、最適化を実行するためにビンに存在する必要がある小さなファイルの数。 | 50 | spark.microsoft.delta.optimize.fast.minNumFiles |
| parquetCoefficient | 最適化コンテキストの最小ファイル サイズを乗算して、圧縮のスコープに含めるビンに存在する必要がある小さなファイル データの最小量を決定します。 | 1.3 | spark.microsoft.delta.optimize.fast.parquetCoefficient |
注
parquetCoefficientにより、ビンのターゲット サイズが最適化コンテキストの最小ターゲット ファイル サイズよりも大きくなります。 この係数は、複数の小さな Parquet ファイルを組み合わせると圧縮が向上し、小さなファイルの合計よりもデータが少なくなるという現実を考慮しています。 この値を増やして、高速最適化でビンをスキップする頻度をより控えめにしたり、小さくしてビンのスキップを制限したりすることができます。
動作方法
高速最適化では、ビンを圧縮する前に追加のチェックが行われます。 候補のビンごとに、高速最適化によって次の結果が評価されます。
- ビン内の生データの推定量 (小さなファイル サイズの合計)
- 小さいファイルを組み合わせて、構成された最小ターゲット サイズを満たすファイルを生成するかどうか
- ビンに構成済みの最小数以上の小さいファイルが含まれているかどうか
高速最適化では、小さなファイルの各ビンが評価され、最小ターゲット サイズに達する可能性がある小さなファイルまたは最小ファイル数を超える可能性がある小さなファイルのみが圧縮されます。 これらのしきい値を満たしていないビンはスキップされるか、部分的に圧縮されます。 最適でないバケットをスキップすると、不要な書き換えが減り、書き込み負荷の増加を抑え、OPTIMIZE ジョブがより安定したものになります。
注
正確な実装は、時間の経過と同時に進化する可能性があります。
高速最適化を使用すると、Delta テーブルのライフサイクル全体で書き換えられたデータを削減できます。 次の図に示すように、高速最適化では最適でないビンがスキップされるため、書き込みの増幅が少なく、より高速で、よりべき等な OPTIMIZE ジョブになります。
注
図の目的上の図では、圧縮から書き込まれたファイルのサイズが小さいファイルのサイズの合計であると想定しています。 それはまた、1 の parquetCoefficient を意味します。
制限事項
- 液体クラスタリングおよび Z オーダー操作には適用されません
- 高速最適化では、自動圧縮の動作は変更されません
ファイル レベルの圧縮ターゲット
圧縮最小サイズターゲットと最大ファイル サイズ ターゲットの変更に基づいて、以前に圧縮 (十分な大きさ) と見なされていたデータの書き換えを回避するために、 spark.microsoft.delta.optimize.fileLevelTarget.enabled を有効にして、既に圧縮されたファイルの再コンパイルを防ぐことができます。 有効にすると、ファイルは圧縮時にターゲット ファイル サイズの少なくとも半分に達していた場合、再圧縮されません。 ファイル レベルのターゲットを維持すると、圧縮ターゲット サイズが時間の経過と同時に変化する (たとえば、アダプティブ ターゲット ファイル サイズの評価とより大きなターゲットの設定から) ため、書き込み増幅が最小限に抑えられます。 有効にすると、OPTIMIZE の実行時に OPTIMIZE_TARGET_SIZE タグが新しいファイルに追加されます。または、 delta.targetFileSize または delta.targetFileSize.adaptive テーブル プロパティが設定されている場合は、書き込み操作に対して追加されます。
注
既定では有効になっていませんが、ファイル レベルの圧縮ターゲット を有効にして、書き込み増幅の可能性を制限することをお勧めします。
自動圧縮
自動圧縮では、書き込み操作のたびにパーティションの正常性が評価されます。 パーティション内の過剰なファイル断片化 (小さなファイルが多すぎる) を検出すると、書き込みがコミットされた直後に同期 OPTIMIZE 操作がトリガーされます。 圧縮はプログラムによって有益であると判断された場合にのみ実行されるため、ファイルのメンテナンスに対するこのライター駆動型のアプローチが最適です。
セッション レベルで有効にする
セッション レベルで spark.databricks.delta.autoCompact.enabled を設定して、その Spark セッションで作成された新しいテーブルの自動圧縮を有効にします。
テーブル レベルで有効にする
特定のテーブルの自動圧縮を有効にするには、table プロパティの delta.autoOptimize.autoCompact を設定します。
CREATE TABLE dbo.table_name
TBLPROPERTIES ('delta.autoOptimize.autoCompact' = 'true')
DataFrameWriter オプション delta.autoOptimize.autoCompact を使用して、テーブルの作成時に自動圧縮を有効にします。
df.write.option('delta.autoOptimize.autoCompact', 'true').saveAsTable('dbo.table_name')
既存のテーブルで同じテーブル プロパティを有効にします。
ALTER TABLE dbo.table_name
SET TBLPROPERTIES ('delta.autoOptimize.autoCompact' = 'true')
自動圧縮のしきい値を調整する
次の Spark セッション構成を設定して、自動圧縮の動作を調整します。
| プロパティ | Description | 既定値 | セッション構成 |
|---|---|---|---|
| maxFileSize | 圧縮されたファイルのターゲットの最大ファイル サイズ (バイト単位)。 | 134217728b (128 MB) | spark.databricks.delta.autoCompact.maxFileSize |
| minFileSize | 圧縮と見なされるファイルの最小ファイル サイズ (バイト単位)。 このしきい値を下回る値は圧縮のために考慮され、 minNumFiles しきい値にカウントされます。 |
デフォルトで設定されていない場合、明示的に値を設定しない限り、maxFileSizeの 1/2 として計算されます。 |
spark.databricks.delta.autoCompact.minFileSize |
| minNumFiles | 自動圧縮をトリガーするために、 minFileSize しきい値の下に存在する必要があるファイルの最小数。 |
50 | spark.databricks.delta.autoCompact.minNumFiles |
自動圧縮とスケジュールされた OPTIMIZE の選択
Microsoft では、ほとんどのインジェスト ワークロードの既定の戦略として自動圧縮をお勧めします。 通常、これは固定スケジュールを上回り、 OPTIMIZE ジョブを維持する運用上のオーバーヘッドを軽減します。
待機時間の目標が厳密な場合、自動圧縮は書き込み後に同期的に実行されるため、別の Spark プールでスケジュールされた OPTIMIZE が適している可能性があります。
書き込みの最適化などの小さなファイル防止機能と共に圧縮を使用します。 ガイダンスについては、「 書き込みの最適化」を参照してください。
レイクハウス テーブルのメンテナンス
Lakehouse Explorer から、 OPTIMIZE などのアドホック メンテナンス操作を実行できます。 詳細については、 Lakehouse テーブルのメンテナンスを参照してください。
ベスト プラクティスの概要
これらの推奨事項を使用して、Delta テーブル圧縮の書き込みコスト、読み取りパフォーマンス、およびメンテナンスオーバーヘッドのバランスを取ります。
- 頻繁に小さな書き込み (ストリーミングまたはマイクロバッチ) を使用するインジェスト パイプラインの自動圧縮を有効にして、手動スケジューリングを減らします。
- 自動圧縮は、サービス レベルの目標が書き込み待機時間の急増を許容できる場合に、他の書き込みパターンに対して選択的に使用します。
- 多数のパーティションを書き換えたり、Z オーダーを適用したりする必要がある場合は、
OPTIMIZEのをスケジュールします。 -
高速最適化を有効にして書き込みの増幅を減らし、
OPTIMIZEをべき等性にします。 - ファイル レベルの圧縮ターゲットを有効に して、ターゲット ファイル サイズが時間の経過と同時に増加するにつれて、不要な再計算を減らします。
- 書き込み前圧縮は書き込み後の圧縮よりもコストが低くなることが多いため、適切なインジェスト パスで書き込みの最適化を使用します。 ガイダンスについては、「 書き込みの最適化」を参照してください。