データ基盤
リキッドクラスタリングとは?Z-orderとの違いと仕組み
- リキッドクラスタリング
- Z-order
- Delta Lake
- Databricks
- データスキップ
- パーティション
- OPTIMIZE
- 小さなファイル
- クラスタリングキー
- 最小値と最大値
- 予測的最適化
- 削除ベクトル
- プロトコル
- ヒルベルト曲線
- 基本原則
目次
Delta Lake の表は、Parquet のデータファイルと、どのファイルが表に属するかを記録したトランザクションログ(_delta_log)からなる1。ログの記録には、ファイルごとの行の数と、列ごとの最小値と最大値を書くことができる2。クエリは、この統計を見て、条件に合う行を含みえないファイルを開かずに済ませる3。
Databricks が示す基本原則の6番目は、性能とコストのために規模を広げ、最適化できるように作ることを求める4。読むファイルを減らせば、クエリが速くなるだけでなく、計算の費用も下がる。本稿は、ファイルの中の行の並べ方をこの原則に関わるものとして扱う。
ファイルの並べ方には、パーティション、Z-order、リキッドクラスタリングという三つの方法があり、Databricks は新しい表にリキッドクラスタリングを勧めている5。本稿は、一つの注文の表を例に取り、三つの方法で各ファイルの最小値と最大値の幅がどう変わるかを説明する。そのあと、保守を自動で行う予測的最適化と、ファイルを書き直さずに行を消す削除ベクトルを、同じ表の上で扱う。
リキッドクラスタリングは、ストレージの上のファイルとログをどう変え、パーティションや Z-order と何が違うのか。
リキッドクラスタリングは、キーの値が近い行を同じファイルに集めて各ファイルの値の幅を狭め、読むファイルを絞る方法で、Z-order と違ってキーを表に記録し、通常の OPTIMIZE ではまとめる必要のあるファイルだけを書き直す。 Delta Lake はファイルごとの列の最小値と最大値をログに持ち、条件の値を含みえないファイルを読まない。そのため、読むファイルをどれだけ絞れるかは、値の近い行がどれだけ同じファイルに集まっているかで決まる。パーティションは値ごとにディレクトリを分けるので、値の種類が多い列に向かない。Z-order は複数の列で値の近い行を集めるが、列を足すほど効果が落ち、実行のたびに列を指定してまとめ直す。Databricks でリキッドクラスタリングを有効にすると、削除ベクトルなどの機能も既定で有効になる。削除ベクトルは、データファイルを書き直さずに、どの行を消したかを別のファイルやログの中に記録するので、それを知らないクライアントは消した行まで読んでしまう。そのため、有効にした表は古いクライアントでは読めなくなる。
一か月分の注文と二つのクエリ
※ この節の数値は説明のための仮定で、測定値ではありません。
表 sales.silver.orders に、取り込みの処理が 5 分ごとに注文を追記するとする。一回の追記が一つの小さなデータファイルになれば、一か月で約 8,600 個のファイルができる。分析の担当者は、次の二つのクエリをよく実行する。
SELECT * FROM sales.silver.orders WHERE order_date = '2026-10-01';
SELECT * FROM sales.silver.orders WHERE customer_id = 'C-00017';
追記したままの表では、ログに記録された各ファイルの最小値と最大値は、次のような形になる。
ファイル order_date の範囲 customer_id の範囲
part-0001 2026-10-01 〜 2026-10-01 C-00003 〜 C-99871
part-0002 2026-10-01 〜 2026-10-01 C-00011 〜 C-99950
…
part-8640 2026-10-30 〜 2026-10-30 C-00007 〜 C-99902
注文は届いた順に書かれるので、各ファイルの注文日の範囲は一日に収まる。一つ目のクエリは、範囲に 10 月 1 日を含まないファイルをすべて読み飛ばし、その日の約 290 個だけを読む。一方、5 分の間にもさまざまな顧客の注文が届くので、どのファイルの顧客 ID の範囲も、ほぼ全体にわたる。二つ目のクエリは、C-00017 を含みえないファイルをほとんど除けず、約 8,600 個のほぼすべてを開く。
そこで、表に二つの列をクラスタリングキーとして指定し、OPTIMIZE で並べ直す。
ALTER TABLE sales.silver.orders CLUSTER BY (order_date, customer_id);
OPTIMIZE sales.silver.orders FULL;
並べ直したあとは、ファイルは少数の大きなものになり、各ファイルの範囲は次のような形になる。
ファイル order_date の範囲 customer_id の範囲
part-a01 2026-10-01 〜 2026-10-01 C-00001 〜 C-33400
part-a02 2026-10-01 〜 2026-10-01 C-33401 〜 C-66800
part-a03 2026-10-01 〜 2026-10-01 C-66801 〜 C-99999
part-a04 2026-10-02 〜 2026-10-02 C-00001 〜 C-33400
…
注文日の範囲は一日のまま、その中で顧客 ID の範囲が狭くなった。Databricks によれば、日付のように値の種類が少ない列をキーに含めると、リキッドクラスタリングは各ファイルに一日分の行だけを入れようとし、その中を顧客 ID のような値の種類が多い列で細かく並べる6。一つ目のクエリは、10 月 1 日の 3 個のファイルを読む。二つ目のクエリは、各日のファイルのうち C-00017 を含む 1 個ずつ、合わせて 30 個だけを読む。
追記したままの表と並べ直した表の範囲を比べると、次のことが分かる。
- 各ファイルの値の範囲が狭いほど、条件に合う行を含みうるファイルを絞り込める。
- 一つの列の順に並べると、ほかの列の範囲は広いまま残る。二つの列で集めると、両方の列の範囲を狭くできる。
- 並べ直しにはファイルを書き直す費用がかかるので、どのファイルを、いつ書き直すかが問題になる。
読み飛ばし:ファイルごとの最小値と最大値
Databricks は、各ファイルの列ごとの最小値と最大値、NULL の数、行数といった統計をクエリの時点で使い、条件に合わないファイルを読み飛ばす。これをデータスキップと呼ぶ3。外部テーブルでは、既定で先頭の 32 列について統計を取る。Unity Catalog のマネージドテーブルでは、予測的最適化が、クエリの絞り込みでよく使われる列の統計を取るので、32 列の制限は無い3。
注文日のように、行が届く順と一致する列で絞り込むと、追記したままの表でも多くのファイルを読み飛ばせる。各ファイルが、届いた時間の近い行だけを持つからである。Databricks の文書は、パーティションを持たない Delta Lake の表は、取り込んだ時刻の順に自然にまとまり、日時の列でパーティションを分けた場合に近い性能が、何も調整せずに得られるとしている7。ただし、UPDATE や MERGE で多くの行を変えると、この順は崩れる。そのため文書は、その場合には取り込みの順と一致する列(イベントの時刻や作成日など)をリキッドクラスタリングキーにするよう勧めている7。
一方、届いた順と関係の無い列、たとえば顧客 ID で絞り込むと、統計はほとんど役に立たない。以下の三つの方法は、どれも、このような列についてファイルの範囲を狭める方法である。
小さなファイルと OPTIMIZE
並べ方の前に、ファイルの数の問題がある。1 回の追記で 1 個のファイルができるとすると、5 分ごとの追記で一か月に約 8,600 個のファイルができ、それぞれがログに統計の記録を持つ。クエリはそのすべてを確かめたうえで、条件に合う行を含みうるファイルを一つずつ開く。ファイルが小さく多いほど、確かめる記録も、開くファイルも増える。2020 年の論文は、小さなファイルの問題は HDFS でもよく起きるが、クラウドのストレージでは性能への影響がより大きいと書いている8。
OPTIMIZE は、データファイルを書き直して、表のファイルの配置を整える命令である9。リキッドクラスタリングを使わない表では、既定で、小さなファイルを大きさのそろったファイルにまとめ直す(ビンパッキング)。表のデータは変えないので、OPTIMIZE の前後で読み取りの結果は同じである9。ログには、まとめる前のファイルの remove と、まとめたあとのファイルの add が一件の版として書かれる10。同じデータに二度実行しても、二度目は何もしない11。
まとめる前の小さなファイルは、過去の版を読むためにストレージに残る。消すには VACUUM を実行する12。そのため、OPTIMIZE の直後には、ストレージの使用量はむしろ増える。また、Databricks には、書き込みのあとに小さなファイルをまとめる自動圧縮と、書き込みの前にデータを組み替えて少数の大きなファイルを書く最適化された書き込みがあるが、文書はどちらも OPTIMIZE の完全な代わりにはならないと書く13。
パーティション:値ごとにディレクトリを分ける
パーティションは、指定した列の値ごとに、データファイルを別の場所に分けて書く方法である。注文日でパーティションを分けると、表の中身は次のようになる。
orders/
├── _delta_log/
├── order_date=2026-10-01/
│ ├── part-0001.parquet
│ └── …
├── order_date=2026-10-02/
│ └── …
└── …
ログの add の記録には、そのファイルの列の値が "partitionValues": {"order_date": "2026-10-01"} のように書かれる2。注文日で絞り込むクエリは、統計を見るまでもなく、ほかの日のファイルをすべて除ける。order_date=… という名前のディレクトリは、オープンソースの実装が既定で使う慣習で、Delta Lake のプロトコルの一部ではない27。どのファイルがどの値に属するかは、ディレクトリの名前ではなく、ログの記録で決まる。
この方法は、値の種類が少ない列にしか向かない。Databricks の文書は、パーティションがうまく働くのは日付や所在地のように値の種類が少ないか決まっている列で、タイムスタンプのように値の種類が多い列には向かないとする7。顧客 ID でパーティションを分ければ、顧客の数だけディレクトリができ、その中には小さなファイルしか入らない。文書は、各パーティションに少なくとも 1 GB のデータを入れること、1 TB 未満の表はパーティションに分けないこと、1 TB から 100 TB の表ではリキッドクラスタリングを使うことを勧め、この範囲ではパーティションは性能を上げるより下げることの方が多いと書く7。
Z-order:複数の列で値の近い行を集める
注文日で絞るクエリと顧客 ID で絞るクエリの両方で読み飛ばしを増やすには、両方の列について各ファイルの範囲を狭くしたい。一つの列で並べ替えるだけでは、これはできない。注文日の順に並べれば顧客 ID の範囲が広く残り、顧客 ID の順に並べれば、今度は注文日の範囲が広くなる。
2020 年の論文は、送信元の IP、送信先の IP、時刻のように、複数の列で厳しく絞り込まれるデータを例に挙げる。Hive の方式でディレクトリを分けると、複数の列で分けたときにパーティションの数が多くなりすぎる8。そこで Delta Lake は、指定した列について、行を Z-order 曲線の順に並べ替える8。
Z-order 曲線は、論文によれば、指定したすべての列で近さを保つ、計算の簡単な空間充填曲線である8。二つの列の場合でいえば、注文日を横軸、顧客 ID を縦軸にとった平面を、小さなます目に分け、Z の字を重ねた順にたどる線にあたる。この順に並べた行を前から順にファイルへ詰めると、一つのファイルには、多くの場合、平面の小さな範囲が入り、注文日と顧客 ID の両方の範囲が狭くなる。ただし、曲線が大きく跳ぶところでは、一方の列の範囲が広がる。論文は、Z-order は各ファイルが選んだ列のそれぞれで狭い範囲の値を持つようにし、統計による読み飛ばしと組み合わせて、読むファイルを減らすと説明する8。
2020 年の論文は、表に Z-order の指定を置き、あとから変えられる設計を述べていた8。現在の Databricks の命令では、OPTIMIZE sales.silver.orders ZORDER BY (order_date, customer_id) のように、OPTIMIZE を実行するたびに列を指定する3。ストレージの上では、ビンパッキングと同じく、並べ替えた行を新しいファイルに書き、ログに元のファイルの remove と新しいファイルの add を一件の版として記録する9。限界は三つある。
- 列を足すほど効果が落ちる。 Databricks の文書は、列を一つ足すごとに効果が落ちるとする3。列が増えると平面が立体、さらに高い次元になり、一つの列あたりの範囲の狭まり方が小さくなるためと考えられる。統計を取っていない列を指定しても効果は無い3。
- まとめ直しの範囲が広い。 オープンソース版の文書は、Z-order を実行するたびに、パーティションの中の新しいファイルも、前に Z-order を済ませたファイルも含めて、すべてのファイルを並べ直そうとすると書く11。Databricks の文書は、Z-order は増分の操作を目指すが、繰り返すたびに時間が短くなる保証は無いとする。ただし、Z-order を済ませたパーティションに新しいデータが入っていなければ、そのパーティションにもう一度実行しても何も変わらない3。文書の構文の例は、
WHEREで対象を直近 1 日のデータに絞っている3。 - パーティションをまたげない。 パーティションを分けた表では、Z-order はパーティションの中でしか働かない7。
リキッドクラスタリング:キーを表に記録して、少しずつまとめる
リキッドクラスタリングは、パーティションと Z-order に代わる、データの配置の最適化の方法である5。クラスタリングキーとする列を最大 4 つ選ぶと、そのキーの値が近い行が同じファイルに集まる。Databricks は、ストリーミングテーブルやマテリアライズドビューを含むすべての新しい表に、リキッドクラスタリングを勧めている5。パーティションや Z-order とは併用できない。
ストレージの上では、二つのことが変わる。一つは、値ごとにディレクトリを分けないことである。ログの add の記録の partitionValues は空になり、まとめたファイルの add には、どの実装でクラスタリングしたかを示す clusteringProvider が書かれる。まだまとめていない追記のファイルには、これが無い2。もう一つは、キーがログに記録されることである。仕様は、クラスタリングキーを、delta.clustering という名前の記録(ドメインメタデータ)に残すよう定めている2。モデルの表のログには、縮めて書くと次のような記録が入る。
{"domainMetadata": {"domain": "delta.clustering",
"configuration": "{\"clusteringColumns\":[[\"order_date\"],[\"customer_id\"]]}"}}
{"add": {"path": "part-a01.parquet", "partitionValues": {},
"clusteringProvider": "liquid", "stats": "..."}}
並べ方の曲線について、Microsoft で Fabric の Spark の機能を担当する Cole は、オープンソースの実装では、キーが一つなら Z-order 曲線を、二つ以上ならヒルベルト曲線を使うと書いている14。どちらも、複数の列の近さを保つ並べ方である。Z-order との違いは、曲線よりも、キーが表に記録されることから生まれる。
- キーを毎回指定しない。 キーは表の定義なので、OPTIMIZE は列を指定せずに実行でき、記録されたキーでまとめる5。書き込みの量が一定の大きさを超えると、書き込みの時点でもまとめる5。
- まとめる必要のあるデータだけを書き直す。 Databricks の説明では、リキッドクラスタリングは増分で働き、OPTIMIZE はまとめる必要のあるデータだけを書き直す5。仕様も、書き手が特定のファイルを特定の時点でまとめる必要は無いと定め、まとめ直す対象を、既定では同じ実装でまとめたファイルと、まだまとめていないファイルに限っている2。モデルでいえば、翌日に追記された約 290 個の小さなファイルを中心に、次の OPTIMIZE でまとめ直す。ただし、オープンソース版 3.2 の実装は、まとまりきっていないファイルの群れを丸ごと書き直していた14。Databricks は、予測的最適化を使わない場合、更新や追記の多い表では 1〜2 時間ごとに OPTIMIZE を実行するよう勧めている5。
- キーを変えてもデータを書き直さない。
ALTER TABLE ... CLUSTER BYでキーを変えると、新しいキーを書いたdelta.clusteringの記録が一件の版としてログに足され、データファイルは変わらない25。その後の OPTIMIZE と書き込みが新しいキーを使う5。既存のデータも新しいキーでまとめ直すにはOPTIMIZE ... FULLを実行し、大きな表では何時間もかかることがある5。初めてキーを付けたときとキーを変えたときには、FULL を付けて実行するよう文書は勧める5。
キーの数は多ければよいわけではない。10 TB 未満の表では、キーを増やすと、一つの列で絞り込むクエリが遅くなることがある5。キーの選び方に迷う場合は、CLUSTER BY AUTO で、Databricks にキーを選ばせることもできる。これは Unity Catalog のマネージドテーブルで使え、予測的最適化を前提にする5。
リキッドクラスタリングは、Databricks では 2024 年 5 月の Databricks Runtime 15.2 で一般提供になり15、現在の文書は Databricks Runtime 15.4 LTS 以降での利用を一般提供としている5。オープンソース版の Delta Lake では、3.1 でプレビューとして入り、3.2 でプレビューの設定が要らなくなった。既存の表で後から有効にする命令と OPTIMIZE ... FULL は、3.3 以降で使える16。
リキッドクラスタリングの効果についての証拠
リキッドクラスタリングが速いことを示す数字の多くは Databricks 自身のもので、外部の報告は処理系と版によって評価が分かれる。Databricks は一般提供の発表で、パーティションと Z-order を組み合わせた場合より書き込みが 7 倍速いと述べたが、これは社内のベンチマークによる数字である17。同じ Databricks の 2026 年の記事は、2 年前には、10 PB のリキッドクラスタリングの表で OPTIMIZE の計画の段階に最大 12 時間かかる場合があったと認め、その後 23 分まで縮めたと書いている6。
Databricks の外では、独立のデータエンジニアの Beach が、リキッドクラスタリングに移してクエリが大きく速くなったのを見たと書いているが、数字は示していない18。Microsoft の Cole は、オープンソース版 Delta Lake 3.2 を使う Fabric の処理系では、少しの追記のあとの OPTIMIZE が、まとまりきっていないファイルの群れを丸ごと書き直してしまう(書き込みの増幅)ので、無条件に採用することを考え直すよう顧客に注意していたと書いている14。同じ記事は、筆者自身が作った Fabric の Runtime 2.0 の機能が、まとめ直すファイルを、まだまとめていないファイル、小さなファイル、削除ベクトルの多いファイルに絞ってこれを解消したとし、リキッドクラスタリングは今や標準の配置の方法になるべきだと結んでいる14。これは Databricks の処理系についての話ではない。
リキッドクラスタリングと Z-order を、Databricks の社外の人が同じデータで比べ、方法と数字を示した測定は、見当たらなかった。
予測的最適化:保守を自動で行う
ここまでの OPTIMIZE と VACUUM を、表ごとに人が計画して実行するのは手間がかかる。予測的最適化は、Unity Catalog のマネージドテーブルについて、OPTIMIZE、VACUUM、統計を取る ANALYZE を Databricks が自動で実行する機能である19。外部テーブルは対象にならない。実行には、ジョブ用のサーバーレスの計算資源が使われ、その分が課金される19。
予測的最適化は、2024 年 11 月 11 日以降に作られたアカウントでは既定で有効で、既存のアカウントへも段階的に広げており、文書は 2026 年 10 月の時点でも、2026 年 8 月までに完了する見込みと書いている19。予測的最適化の下で実行される OPTIMIZE は Z-order を行わない19。また、表の保持期間を 7 日より短く設定しても、予測的最適化の VACUUM は、少なくとも 7 日分のファイルを残す19。
保守を怠った場合の影響については、外部の測定がある。Microsoft の研究者による LST-Bench は、Delta Lake を含む複数の表の形式を比べ、データファイルがたまると性能が落ち、その幅は調べた形式の中で最大 6.8 倍に達し、保守がそれを和らげることを示した20。ただし、測った Delta Lake は調整を加えない 2.2.0 で、削除ベクトルやリキッドクラスタリングが広まる前の版である。原典は劣化の主な原因を、Spark の既定の設定が書き込みを細かく分け、数十万のデータファイルを作ったことに求めている20。
削除ベクトル:ファイルを書き直さずに行を消す
一人の顧客の注文をすべて消すよう依頼が来たとする。削除ベクトルが無ければ、C-00017 の行を含むファイルごとに、その行を除いた写しを書き、ログで元のファイルを除いて写しを加える。Databricks の文書がいうように、削除ベクトルが無い表では、行を一つ変えるにもその Parquet のファイルを丸ごと書き直す21。
削除ベクトルを使うと、元のファイルは書き直さない。代わりに、そのファイルの何行目が消えたかを記録した小さなファイルを、deletion_vector で始まる名前で表の中に書く。小さければ、ログの記録の中に直接書くこともある2。ログには、元のファイルを削除ベクトル無しの形で除き、同じファイルを削除ベクトル付きの形で加える記録が入る。
{"remove": {"path": "part-a01.parquet", "dataChange": true}}
{"add": {"path": "part-a01.parquet", "dataChange": true,
"deletionVector": {"storageType": "u", "pathOrInlineDv": "...",
"sizeInBytes": 40, "cardinality": 2}}}
仕様は、表の一つのファイルを、データファイルの場所と、どの行がもう表に無いかを示す削除ベクトルの組として扱う2。cardinality は、この削除ベクトルが消す行の数である。消した行はデータファイルに物理的に残っており、読み手は読むときにそれを飛ばさなければならない2。
書き込みは速くなり、読み取りには手間が加わる。Microsoft の Cole は、1 億行の表から一行を消す処理が、削除ベクトルを使うとほぼ 8 倍速かったと報告した22。読み取りの遅れは変更の量で違い、同じ記事は、500 万行の MERGE だけを加えた場合は 1.5 倍、1 億行の表の 53% にあたる変更を加えて OPTIMIZE を実行しないままにした場合は 2.3 倍だったと書く22。測ったのは Microsoft Fabric とオープンソース版の Delta Lake 3.2 で、Databricks ではない。
消した行をストレージから本当に消すには、別の手順が要る。ファイルの圧縮だけでは、削除ベクトルに記録した変更が必ずファイルに反映されるとは限らない21。Databricks の文書は、REORG TABLE ... APPLY (PURGE) で削除ベクトルの付いたファイルを書き直し、そのうえで VACUUM で古いファイルを消す手順を示し、ストレージの費用を減らすためや GDPR のような削除の求めに応えるために使うとしている21。
新しい機能と古いクライアント
削除ベクトルを知らないクライアントが part-a01.parquet をそのまま読むと、消したはずの C-00017 の行まで返してしまう。そのため仕様は、削除ベクトルを使う表に、読み取りのプロトコルの版 3 と、deletionVectors という読み取りの機能の宣言を求める2。この宣言を理解しないクライアントは、表を読むこと自体をしない23。Databricks の文書によれば、オープンソース版の Delta Lake で削除ベクトルの表を読むには 2.3.0 以降が要る21。
一方、クラスタリングは、仕様の上では書き込みの機能だけを使う2。そのためオープンソース版の Delta Lake では、リキッドクラスタリングの表でも、読み取りのプロトコルの版は 1 のままである16。ところが Databricks でリキッドクラスタリングを有効にすると、v2 チェックポイントや削除ベクトルなどの機能も既定で一緒に有効になり23、表は読み取りのプロトコルの版 3 を使うので、これに対応しない Delta Lake のクライアントは読めない5。別の部署が古いクライアントで注文の表を読んでいれば、既定のままリキッドクラスタリングを有効にした時点で、その読み取りは止まる。これを避けるため、文書は、既存の表では有効にする前に、一緒に有効になる機能を止める手順も示している5。
Databricks の文書は、プロトコルの引き上げの多くは元に戻せず、既存の読み手や書き手を壊しうると警告している23。機能によっては DROP FEATURE で表から外せるが、外せない機能もある24。checkpointProtection という機能に対応しない外部のクライアントで表に書き込む場合は、24 時間より古い履歴をすべて消す手順が要り、消した履歴の版にはタイムトラベルできなくなる24。
削除ベクトルを新しい表で既定で有効にするかどうかは、ワークスペースの設定で決まり、その既定の値は地域によって違う25。Databricks は、互換性の無い Databricks Runtime の版や、外部の Delta Lake のクライアントで使う表を除いて、すべての表で削除ベクトルを使うよう勧めている25。また、Iceberg のクライアントから Delta Lake の表を読ませる機能のうち、Iceberg v2 での読み取りとは、削除ベクトルを同時に使えない26。
出典26件
-
Databricks「What is Delta Lake in Databricks?」2026年10月10日取得. https://docs.databricks.com/aws/en/delta/ — Parquet とトランザクションログ、既定の形式。 ↩
-
Delta Lake「Delta Transaction Log Protocol」GitHub, 2026年10月10日取得. https://github.com/delta-io/delta/blob/master/PROTOCOL.md — add の統計と partitionValues、クラスタリングの表と delta.clustering、削除ベクトルの記録と読み手の要件。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12
-
Databricks「Data skipping」2026年10月10日取得. https://docs.databricks.com/aws/en/tables/data-skipping — ファイルごとの統計、32列の制限、Z-order の構文と限界。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8
-
Databricks「Guiding principles」2026年10月10日取得. https://docs.databricks.com/aws/en/lakehouse-architecture/guiding-principles — 原則6の性能とコストのための最適化。 ↩
-
Databricks「Use liquid clustering for tables」2026年10月10日取得. https://docs.databricks.com/aws/en/tables/clustering — 定義、すべての新しい表に推奨、増分のクラスタリング、キーの変更と FULL、キーの数、CLUSTER BY AUTO、プロトコルの版。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13 ↩14 ↩15 ↩16
-
Gong ほか「Debunking 8 data layout myths」Databricks Blog, 2026. https://www.databricks.com/blog/debunking-8-data-layout-myths-why-liquid-clustering-outperforms-partitioning — OPTIMIZE の計画に最大12時間かかった過去と、その短縮。 ↩ ↩2
-
Databricks「When to partition tables on Databricks」2026年10月10日取得. https://docs.databricks.com/aws/en/tables/partitions — 取り込みの時刻の順のまとまり、値の種類の少ない列、1 GB と 1 TB の目安、Hive 形式はプロトコルの外、Z-order はパーティションの中だけ。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6
-
Armbrust ほか「Delta Lake: High-Performance ACID Table Storage over Cloud Object Stores」PVLDB 13(12), 2020. https://www.vldb.org/pvldb/vol13/p3411-armbrust.pdf — 小さなファイルの問題、Z-order 曲線による複数の列での並べ替え(著者は全員 Databricks)。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6
-
Databricks「Optimize data file layout」2026年10月10日取得. https://docs.databricks.com/aws/en/tables/operations/optimize — ビンパッキング、読み取りの結果は変わらない。 ↩ ↩2 ↩3
-
Databricks「Work with table history」2026年10月10日取得. https://docs.databricks.com/aws/en/tables/history — OPTIMIZE のログの例。 ↩
-
Delta Lake「Optimizations」2026年10月10日取得. https://docs.delta.io/optimizations-oss/ — ビンパッキングは冪等、Z-order は毎回パーティションの全ファイルを並べ直そうとする。 ↩ ↩2
-
Databricks「Best practices: Delta Lake」2026年10月10日取得. https://docs.databricks.com/aws/en/delta/best-practices — OPTIMIZE は古いファイルを消さない。 ↩
-
Databricks「Control data file size」2026年10月10日取得. https://docs.databricks.com/aws/en/tables/tune-file-size — 自動圧縮と最適化された書き込みは OPTIMIZE の完全な代わりではない。 ↩
-
Cole「How Incremental Liquid Clustering Works」2026. https://milescole.dev/data-engineering/2026/07/24/Incremental-Liquid-Clustering-Fabric-Runtime-2.html — キーの数による曲線の違い、Delta Lake 3.2 での書き込みの増幅と Fabric の Runtime 2.0 での解消(筆者は Microsoft の Fabric の担当)。 ↩ ↩2 ↩3 ↩4
-
Databricks「Databricks Runtime 15.2」リリースノート, 2026年10月10日取得. https://docs.databricks.com/aws/en/release-notes/runtime/15.2 — 2024年5月、リキッドクラスタリングの一般提供。 ↩
-
Delta Lake「Use liquid clustering for Delta tables」2026年10月10日取得. https://docs.delta.io/delta-clustering/ — 3.1 のプレビュー、3.2 の正式化、3.3 の既存の表での有効化と FULL、読み取りのプロトコルの版。 ↩ ↩2
-
Jiang・Kim「Announcing General Availability of Liquid Clustering」Databricks Blog, 2024. https://www.databricks.com/blog/announcing-general-availability-liquid-clustering — 書き込みが7倍速いという社内のベンチマーク。 ↩
-
Beach「Clustering vs Partitions - Pick your poison.」Data Engineering Central, 2025. https://dataengineeringcentral.substack.com/p/clustering-vs-partitions-pick-your — リキッドクラスタリングへの移行でクエリが大きく速くなったという経験(数字は無い)。 ↩
-
Databricks「Predictive optimization for Unity Catalog managed tables」2026年10月10日取得. https://docs.databricks.com/aws/en/optimizations/predictive-optimization — 対象、課金、既定で有効になる時期、Z-order を行わない、7日の下限。 ↩ ↩2 ↩3 ↩4 ↩5
-
Camacho-Rodríguez ほか「LST-Bench: Benchmarking Log-Structured Tables in the Cloud」Proc. ACM Manag. Data 2(1), 2024. https://doi.org/10.1145/3639314 https://arxiv.org/abs/2305.01120 — 保守しないと最大6.8倍の劣化(Delta・Iceberg・Hudi を通した値)。 ↩ ↩2
-
Databricks「Deletion vectors in Databricks」2026年10月10日取得. https://docs.databricks.com/aws/en/tables/features/deletion-vectors — 一行の変更でファイル全体を書き直す問題、クライアントの対応版、物理的な削除の手順。 ↩ ↩2 ↩3 ↩4
-
Cole「Unlock Faster Writes in Delta Lake with Deletion Vectors」2024. https://milescole.dev/data-engineering/2024/11/04/Deletion-Vectors.html — 一行の削除はほぼ8倍速く、行の53%を変えて OPTIMIZE しないと、読み取りは削除ベクトルなしの表の2.3倍遅い(Fabric で測定)。 ↩ ↩2
-
Databricks「Delta Lake feature compatibility and protocols」2026年10月10日取得. https://docs.databricks.com/aws/en/tables/features/feature-compatibility — 対応しない読み取りの機能のある表は読めない、引き上げの多くは不可逆。 ↩ ↩2 ↩3
-
Databricks「Drop a Delta Lake table feature and downgrade table protocol」2026年10月10日取得. https://docs.databricks.com/aws/en/tables/features/drop-feature — 外せない機能、24時間より古い履歴の削除。 ↩ ↩2
-
Databricks「Auto-enable deletion vectors」2026年10月10日取得. https://docs.databricks.com/aws/en/admin/workspace-settings/deletion-vectors — ワークスペースの設定、既定の値は地域で違う、推奨と例外。 ↩ ↩2
-
Databricks「Read Delta Lake tables with Iceberg clients」2026年10月10日取得. https://docs.databricks.com/aws/en/delta/iceberg-reads — Iceberg v2 の読み取りでは削除ベクトルを使えない(v3 は対応)。 ↩
この記事はAIが執筆しています。内容には誤りが含まれる可能性があります。ご注意ください。