適用対象:
Databricks SQL
Databricks Runtime
このページでは、Delta Lake データのレイアウトを最適化する OPTIMIZE コマンドについて説明します。 データのサブセットを最適化したり、列ごとにデータを併置したりすることができます。 コロケーションを指定せず、テーブルで液体クラスタリングが使用されていない場合、Delta Lake はビンパッキングの最適化を実行します。
構文
OPTIMIZE table_name [FULL] [WHERE predicate]
[ZORDER BY (col_name1 [, ...] ) ]
Note
ビンパッキングの最適化は べき等です。同じデータ セットで 2 回実行すると、2 回目の実行は無効になります。 ディスク上のサイズに関して均等にバランスの取れたデータ ファイルが生成されますが、必ずしもファイルあたりのタプルの数ではありません。 2 つのメジャーは、最も多く相関しています。
Z オーダーは べき等ではありませんが、増分的に動作します。 Z オーダーにかかる時間は、複数の実行で減少する保証はありません。 ただし、Z 順序付けされたパーティションに新しいデータが追加されなかった場合、そのパーティションで Z-Ordering をもう一度実行しても効果はありません。 Z オーダーでは、タプルの数に関して均等にバランスの取れたデータ ファイルが生成されますが、必ずしもディスク上のデータ サイズは生成されません。 2 つのメジャーは最も頻繁に関連付けられますが、最適化タスク時間のずれは、分岐したときに発生する可能性があります。
Note
Databricks Runtime を使用する場合、出力ファイルのサイズを制御するには、Spark 構成を設定しますspark.databricks.delta.optimize.maxFileSize。 既定値は 1073741824 (1 GB) です。
104857600を指定すると、ファイル サイズが 100 MB に設定されます。
パラメーター
-
既存の Delta テーブルを識別します。 この名前には、テンポラル指定やオプション指定を含めないでください。
FULL適用対象:
Databricks Runtime 16.0 以降テーブル内のすべてのデータ ファイルを書き換えます。
OPTIMIZE table_name FULLを使用して次の手順を実行します。- 以前にクラスター化されたデータを含め、テーブル全体を最適化します ( 液体クラスタリングを使用するテーブルの場合)。
-
delta.parquet.compression.codecプロパティを使用してテーブルの圧縮コーデックを変更するときに、既存のデータ ファイルを再圧縮します。
圧縮コーデックを変更した後に既存のデータを再圧縮するには、
OPTIMIZE table_name FULL実行します。-- Change compression codec ALTER TABLE table_name SET TBLPROPERTIES ('delta.parquet.compression.codec' = 'ZSTD'); -- Recompress all existing data files OPTIMIZE table_name FULL;液体クラスタリングが有効になっているテーブル内のファイルのサブセットを最適化するには、
FULLとWHERE述語 (Databricks Runtime 18.1 以降) を組み合わせます。 単一のクラスタリング列の単純な範囲述語のみがサポートされます。 ファイルは、その範囲の一部が述語と重複している場合に含まれます。 たとえば、OPTIMIZE events FULL WHERE date > 15には、ファイルの範囲が述語と重複するため、範囲(col_min = 10, col_max = 20)を持つファイルが含まれています。WHEREパーティション/クラスタリング述語に一致する行のサブセットを最適化します。 パーティション/クラスタリング キー属性のフィルターのみがサポートされます。
液体クラスタリングを使用するテーブルの場合は、代わりに
OPTIMIZE table_name FULL WHERE predicate(Databricks Runtime 18.1 以降) を使用します。ZORDER BYNote
Databricks では、Z オーダーではなく、すべての新しいテーブルに対して液体クラスタリングが推奨されます。 表に液体クラスタリングを使用するを参照してください。
同じファイル セット内の列情報を併置します。 Delta Lake のデータスキップ アルゴリズムでは、共同ローカリティを使用して、読み取る必要があるデータの量を減らします。 コンマ区切りリストとして複数の列を指定できますが、列を追加するたびに併局所性の有効性が低下します。
この句は、 液体クラスタリングを使用するテーブルでは使用できません。
例
> OPTIMIZE events;
> OPTIMIZE events FULL;
> -- Partitioned table
> OPTIMIZE events WHERE date >= '2017-01-01';
> -- Table with liquid clustering enabled (DBR 18.1 and above)
> OPTIMIZE events FULL WHERE date >= '2025-01-01';
> OPTIMIZE events
WHERE date >= current_timestamp() - INTERVAL 1 day
ZORDER BY (eventType);
詳細については、「 データ ファイル レイアウトの最適化」を参照してください。