メインコンテンツまでスキップ

データファイルのレイアウトを最適化する

予測的最適化は on Unity Catalog マネージドテーブルに対して自動的に OPTIMIZE を実行します。Databricks では、すべての Unity Catalog マネージドテーブルに対して予測的最適化を有効にして、データのメンテナンスを簡素化し、ストレージ コストを削減することをお勧めします。 Unity Catalog マネージドテーブルの予測的最適化を参照してください。

OPTIMIZE コマンドは、テーブルのデータ レイアウトを改善するためにデータ ファイルを書き換えます。リキッドクラスタリングが有効になっているテーブルの場合、 OPTIMIZE はデータファイルをリキッドクラスタリングキーでグループ化するように書き換えます。パーティションが定義されているテーブルの場合、ファイルの圧縮とデータ・レイアウトはパーティション内で実行されます。

リキッドクラスタリングのないテーブルには、書き換え時のデータクラスタリングを改善するために、オプションで ZORDER BY 句を含めることができます。 Databricks 、パーティション、ZORDER、またはその他のデータレイアウトアプローチの代わりにリキッドクラスタリングを使用することをお勧めします。

注記

ZORDER Delta Lake に特化した最適化です。Apache Icebergテーブルでは、代わりにクラスター化と並べ替えの戦略を使用します。

See OPTIMIZE.

重要

Databricks Runtime 16.0 以降では、OPTIMIZE FULL を使用して、リキッドクラスタリングが有効になっているテーブルの再クラスタリングを強制できます。「再クラスタリングの強制」を参照してください。

構文例

コンパクションをトリガーするには、OPTIMIZEコマンドを実行します。

SQL
OPTIMIZE table_name

膨大なデータがあり、そのうちの一部だけを最適化したい場合は、WHERE を使ってオプションのパーティション述語を指定します。

SQL
OPTIMIZE table_name WHERE date >= '2022-11-18'
注記
  • ビンパッキング最適化は べき等 であり、同じデータセットで 2 回実行された場合、2 回目の実行は効果がありません。
  • ビンパッキングは、ディスク上のサイズに関して均等なバランスのデータファイルを生成することを目的としていますが、必ずしもファイルごとのタプルの数ではありません。ただし、2つの測定値はほとんどの場合相関しています。
  • OPTIMIZE操作を実行するためのPythonとScala APIは、Databricks Runtime 11.3 LTS以降で使用できます。

Delta Lake テーブルのリーダーはスナップショット分離を使用します。つまり、 OPTIMIZE がトランザクション ログから不要なファイルを削除しても、中断されません。OPTIMIZE はテーブルにデータ関連の変更は行わないため、 OPTIMIZE の前後に読み取っても同じ結果が得られます。ストリーミングソースであるテーブルで OPTIMIZE を実行しても、このテーブルをソースとして扱う現在または将来のストリームには影響しません。OPTIMIZE は、削除されたファイルと操作によって追加されたファイルのファイル統計 (最小、最大、合計など) を返します。最適化統計には、Z-ordering 統計、バッチ数、最適化されたパーティションも含まれます。

また、自動圧縮を使用して、小さなファイルを自動的に圧縮することもできます。「自動圧縮」を参照してください。

どのくらいの頻度でOPTIMIZEを実行すればよいですか?

Unity Catalog マネージドテーブルの予測的最適化を有効にすると、費用対効果が高い場合にOPTIMIZEが自動的に実行されるようになります。

OPTIMIZEの実行頻度を選択する際、パフォーマンスとコストの間にはトレードオフがあります。エンドユーザーのクエリパフォーマンスを向上させるため、OPTIMIZEをより頻繁に実行してください。リソース使用量が増加するため、より高額な費用が発生します。コスト最適化のため、頻度を減らして実行してください。

Databricks では、まず OPTIMIZE を毎日実行することから開始し (スポット価格が低い夜間が望ましい)、その後、頻度を調整してコストとパフォーマンスのトレードオフのバランスを取ることをお勧めします。

OPTIMIZE を実行するのに最適なインスタンスタイプは何ですか?

両方の操作は、大量のParquetデコードとエンコードを伴うCPU負荷の高い操作です。

Databricksでは、**コンピュートに最適化された**インスタンスタイプを推奨しています。OPTIMIZEもアタッチされたSSDの恩恵を受けます。