第6章 トラブルシューティング・監視・最適化 / 想定学習時間:30〜40分 / 最終確認:2026年8月

6-3. Liquid ClusteringとPredictive Optimization

🎯 この節の学習目標

1. なぜデータレイアウトが性能を左右するのか

6-2 では実行中のクエリのボトルネックを診断しました。しかし、クエリが遅い原因はしばしばデータの置き方(レイアウト)にあります。テーブルをスキャンするとき、Delta Lake はファイルごとの統計情報(各列の最小値・最大値)を使って「読む必要のないファイル」を丸ごと飛ばします(データスキッピング)。フィルタ条件に使う列の値が近い行同士を同じファイルにまとめて配置できていれば、このスキップが強力に効きます。逆に値が散らばっていると、ほぼ全ファイルを読む羽目になります。

この「よく使う列で行を物理的に寄せて配置する」ための手法が、従来は静的パーティショニング(PARTITIONED BY)ZORDER でした。そして現在 Databricks が推奨するのが Liquid Clustering です。

2. 従来手法の限界:静的パーティションとZORDER

手法仕組み弱点
静的パーティショニング
(PARTITIONED BY)
指定列の値ごとに物理ディレクトリを分割するキーは作成後に変更できない(変更にはテーブル全体の書き直しが必要)。高カーディナリティ列は不可(パーティション=小ファイルが爆発する)。値の偏りがそのままファイルサイズの偏りになる
ZORDER
(OPTIMIZE ... ZORDER BY)
OPTIMIZE 実行時に、指定列の値が近い行を同じファイルに並べ替えるOPTIMIZE のたびに全面的な書き直しが起きやすくコストが高い。新規データは次の OPTIMIZE まで最適化されない。キー変更のたびに再実行が必要で、増分的でない

つまり従来は、「パーティション列を何にするか」をテーブル設計の最初に当てなければならず、外すと後から直すのが大変でした。クエリパターンは運用の中で変わっていくのに、レイアウトが固定的だったのです。

3. Liquid Clustering:柔軟でスキューに強いレイアウト

Liquid Clustering は、静的パーティショニングと ZORDER の両方を置き換える、Delta テーブルのデータレイアウト方式です。テーブル作成時に CLUSTER BY でクラスタリングキーを指定します。

💡 具体例:Liquid Clustering テーブルの作成とキー変更

-- 作成時にクラスタリングキーを指定
CREATE TABLE sales (
  order_id BIGINT,
  customer_id BIGINT,
  order_date DATE,
  amount DOUBLE
)
CLUSTER BY (order_date, customer_id);

-- クエリパターンが変わったら、キーは後から変更できる
ALTER TABLE sales CLUSTER BY (customer_id);

-- キーの指定自体を Databricks に任せる(自動クラスタリング)
CREATE TABLE events (...) CLUSTER BY AUTO;

変更後のキーは以降に書き込まれるデータに適用され、既存データは OPTIMIZE の実行に伴い増分的に再クラスタリングされます。全面書き直しを強制されない点が ZORDER との大きな違いです。

Liquid Clustering の特長を整理します。

📝 試験のポイント

選択肢の見分け方:「高カーディナリティ列でよくフィルタされる」「クラスタリングキーを後から変更したい」「データの偏り(スキュー)があるテーブル」という条件が出たら、静的パーティショニングや ZORDER ではなく Liquid Clustering(CLUSTER BY)が正解側です。逆に Liquid Clustering と静的パーティションは併用できない(同一テーブルで PARTITIONED BYCLUSTER BY は同時指定不可)ことも覚えておきましょう。

4. Predictive Optimization:テーブルメンテナンスの自動化

レイアウトを決めても、テーブルには継続的なメンテナンスが必要です。従来は次の作業をエンジニアが手動またはジョブのスケジュールで運用してきました。

Predictive Optimization は、これらのメンテナンス操作を Databricks が自動で判断・実行する機能です。対象は Unity Catalog の管理テーブル(managed table)で、各テーブルの利用パターンとデータの状態を分析し、「最適化する価値があるテーブルに、価値があるタイミングで」OPTIMIZE や VACUUM をサーバーレスコンピュート上で実行します。

観点手動メンテナンスPredictive Optimization
実行の判断エンジニアがスケジュールを設計・調整Databricks が利用状況から自動判断
実行基盤自前のジョブクラスタ等を用意サーバーレスコンピュートで自動実行
対象任意のテーブルUnity Catalog 管理テーブル
リスク実行し忘れ・過剰実行(無駄なコスト)が起きうる必要なテーブルにだけ実行され、運用負荷が下がる

📝 試験のポイント

OPTIMIZE や VACUUM を実行するジョブの管理をやめて、運用負荷を減らしたい」という要件には Predictive Optimization が対応します。前提条件としてUnity Catalog の管理テーブルであることがセットで問われる点に注意してください。外部テーブル(external table)は対象外です。また、役割の違いとして「Liquid Clustering=データの並べ方(レイアウト)」「Predictive Optimization=メンテナンス(OPTIMIZE/VACUUM)の自動実行」という軸で区別しましょう。両者は排他ではなく、組み合わせて使うものです。

5. 手法の総合比較と選択指針

観点静的パーティションZORDERLiquid Clustering
キーの変更不可(全書き直し)OPTIMIZE 再実行で変更可(高コスト)ALTER TABLE で容易
高カーディナリティ列不向き(小ファイル爆発)
データの偏りへの耐性弱い(巨大パーティション化)中程度強い(ファイルサイズを平準化)
最適化の方式書き込み時に固定OPTIMIZE 時に全面的に並べ替え増分的に再クラスタリング
運用の自動化手動設計手動実行が前提CLUSTER BY AUTO + Predictive Optimization でキー選定もメンテナンスも自動化可

新規に作る Delta テーブルでは、特別な理由がない限り Liquid Clustering を第一候補とし、Unity Catalog 管理テーブルであれば Predictive Optimization を有効にして OPTIMIZE / VACUUM の運用を手放す、というのが現在の推奨構成です。既存の試験問題や現場のテーブルには静的パーティションや ZORDER も残っているため、それぞれの弱点(=Liquid Clustering が解決した点)を対比で覚えるのが効率的です。

✅ この節のまとめ

練習問題

問1. 数十億行のイベントテーブルは、値の種類が非常に多い user_id 列でフィルタされることが多い。また、分析ニーズの変化により絞り込みに使う列が今後変わる可能性がある。データレイアウトとして最も適切なのはどれか。

  1. user_id で静的パーティショニング(PARTITIONED BY)する
  2. CLUSTER BY (user_id) の Liquid Clustering を使う
  3. パーティションもクラスタリングも設定しない
  4. 日付列で静的パーティショニングし、user_id での絞り込みは全件スキャンで対応する
解答と解説を見る

正解:B

「高カーディナリティ列でのフィルタ」と「キーが将来変わりうる」という2条件は、どちらも Liquid Clustering の得意分野です。Aは user_id の値ごとにパーティションが作られ、膨大な小ファイル・小ディレクトリが発生するため不適切です。Cはデータスキッピングがほとんど効かず、スキャン量が過大になります。Dは user_id での絞り込みという主要クエリパターンを最適化できていません。

問2. Predictive Optimization の説明として正しいものはどれか。

  1. クエリの実行計画を実行時統計に基づいて再最適化する Spark の機能である
  2. Unity Catalog 管理テーブルに対し、OPTIMIZE や VACUUM などのメンテナンス操作を Databricks が自動的に判断・実行する機能である
  3. すべての外部テーブルに対して自動で ZORDER を実行する機能である
  4. クラスタのノード数を負荷に応じて自動増減させる機能である
解答と解説を見る

正解:B

Predictive Optimization は Unity Catalog 管理テーブルの利用状況を分析し、価値のあるタイミングで OPTIMIZE / VACUUM をサーバーレス基盤上で自動実行する機能です。Aは AQE(Adaptive Query Execution)の説明です(6-2 参照)。Cは対象が誤りで、外部テーブルは Predictive Optimization の対象外です。Dはオートスケーリングの説明です。

問3. ZORDER と比較したときの Liquid Clustering の利点として最も適切なのはどれか。

  1. Liquid Clustering はデータスキッピングを使わないため、統計情報の収集が不要になる
  2. クラスタリングキーを ALTER TABLE で後から変更でき、既存データの全面的な書き直しを強制されず増分的に再クラスタリングできる
  3. Liquid Clustering は OPTIMIZE を一切必要としない
  4. Liquid Clustering は静的パーティショニングと同時に指定することで効果が倍増する
解答と解説を見る

正解:B

キー変更の容易さと増分的なクラスタリングが、OPTIMIZE のたびに大規模な並べ替えが必要な ZORDER に対する代表的な利点です。Aは誤りで、Liquid Clustering もデータスキッピング(ファイル統計)を活用して読むファイルを減らします。Cも誤りで、既存データの再クラスタリングは OPTIMIZE の実行(または Predictive Optimization による自動実行)を通じて進みます。Dは誤りで、同一テーブルに PARTITIONED BY と CLUSTER BY は同時指定できません。

問4. データエンジニアリングチームは、数百の Delta テーブルに対する OPTIMIZE と VACUUM のスケジュールジョブの管理に手間がかかっている。テーブルは Unity Catalog の管理テーブルである。運用負荷を最も削減できる方法はどれか。

  1. 各テーブルの OPTIMIZE ジョブの実行間隔を短くして、実行忘れを防ぐ
  2. Predictive Optimization を有効化し、メンテナンスの判断と実行を Databricks に任せる
  3. すべてのテーブルを外部テーブルに変換する
  4. VACUUM の保持期間を0時間に設定して、常にすべての古いファイルを即時削除する
解答と解説を見る

正解:B

Unity Catalog 管理テーブルという前提が揃っているため、Predictive Optimization の有効化でメンテナンスジョブの設計・スケジュール管理そのものを手放せます。Aはジョブ管理の手間が減らないうえ、不要な実行によるコスト増を招きます。Cは逆効果で、外部テーブルは Predictive Optimization の対象外になります。Dは危険な設定で、実行中のクエリやタイムトラベルが参照するファイルまで削除されるおそれがあり、運用負荷の削減とも無関係です。