次の方法で共有


OPTIMIZE

適用対象:チェック マークあり 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 に設定されます。

パラメーター

  • table_name

    既存の 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;
    

    液体クラスタリングが有効になっているテーブル内のファイルのサブセットを最適化するには、 FULLWHERE 述語 (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 BY

    Note

    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);

詳細については、「 データ ファイル レイアウトの最適化」を参照してください。