Databricksにおける削除ベクトル
削除ベクトルは、テーブルへの変更を高速化するストレージ最適化機能です。デフォルトでは、単一の行を削除するには、そのレコードを含むParquetファイル全体を書き換える必要があります。削除ベクトルは、このオーバーヘッドを回避できます。削除ベクトルが有効な場合、DELETE、UPDATE、および MERGE の操作によって、Parquet ファイルを書き換えることなく行が変更済みとしてマークされます。削除ベクトルに記録された変更を適用することで、現在のテーブルの状態を特定します。
すべての Apache Iceberg v3 テーブルには、削除ベクトルがデフォルトで含まれています。Apache Iceberg v3 機能を使用を参照してください。Delta Lake テーブルでは、削除ベクトルを明示的に有効にする必要があります。
すべての最適化を最大限に活用するには、Databricks では、削除ベクトルを含むテーブルを書き込む際に Databricks Runtime 14.3 LTS 以降を使用することをお勧めします。削除ベクトルが有効なテーブルを読み取るには、Databricks Runtime 12.2 LTS 以降が必要です。
Databricks Runtime 14.2 以降では、削除ベクトルを持つテーブルで行レベルのコンカレンシーがサポートされます。行レベルの同時実行性を参照してください。
予測I/O更新では、Photonは削除ベクトルを使用してDELETE、MERGE、およびUPDATEの操作を高速化します。予測 I/O を使用して更新を高速化するを参照してください。
削除ベクトルを有効にする
ワークスペース設定では、SQLウェアハウスまたは Databricks Runtime 14.3 LTS 以降を使用する際に、新しいテーブルで削除ベクトルを有効にすることができます。デフォルト設定は地域によって異なります。削除ベクトルの自動有効化を参照してください。
Hive metastoreに格納されているマテリアライズドビューとストリーミングテーブルでは、削除ベクトルはデフォルトでは有効になっていません。
ストリーミングテーブルやマテリアライズドビューを含む任意のテーブルまたはビューで、削除ベクトルのサポートを手動で有効または削除するには、enableDeletionVectors テーブル プロパティを使用します。テーブルを作成または変更するときに、テーブルで削除ベクトルを有効にするには:
- Delta Lake table
- Iceberg table
CREATE TABLE <table-name> [options] TBLPROPERTIES ('delta.enableDeletionVectors' = true);
ALTER TABLE <table-name> SET TBLPROPERTIES ('delta.enableDeletionVectors' = true);
CREATE TABLE <table-name> [options] TBLPROPERTIES ('iceberg.enableDeletionVectors' = true);
ALTER TABLE <table-name> SET TBLPROPERTIES ('iceberg.enableDeletionVectors' = true);
ALTER ステートメントを使用して、マテリアライズドビューまたはストリーミングテーブルで削除ベクトルを有効化または削除することはできません。
削除ベクトルを有効にすると、Databricks はテーブルプロトコルをアップグレードします。アップグレード後、削除ベクトルをサポートしていないクライアントは、テーブルを読み取ることができません。Delta Lake 機能の互換性とプロトコルを参照してください。
Databricks Runtime 14.1 以降では、削除ベクトル テーブル機能を削除して、他のクライアントとの互換性を有効にすることができます。Delta Lake テーブル機能の削除およびテーブルプロトコルのダウングレードを参照してください。
Parquet データファイルへの変更の適用
削除ベクトルは、テーブル内の既存のParquetデータファイルを論理的に変更する論理的な削除として行への変更を示します。これらの変更は、以下のいずれかのイベントによってデータファイルが書き換えられるときに物理的に適用されます。
- テーブルで
OPTIMIZEコマンドが実行されます。 - 自動圧縮により、削除ベクトルを伴うデータファイルの書き換えが実行されます。
REORG TABLE ... APPLY (PURGE)テーブルに対して実行されます。
ファイル圧縮に関連するイベントは、削除ベクトルに記録された変更を解決するための厳密な保証はありません。ターゲットデータファイルがファイルの圧縮の候補ではない場合、削除ベクトルに記録された変更の一部は物理的に適用されない場合があります。REORG TABLE ... APPLY (PURGE) は、削除ベクトルを使用して記録された変更を含むレコードが格納されているすべてのデータファイルを書き換えます。See REORG TABLE.
古いデータを物理的に削除
パージ操作後も、変更されたデータがテーブルの古いデータファイル内に残る場合があります。データを物理的に削除する必要がある場合があります。例えば、クラウドプロバイダーでのストレージコストを削減したり、GDPRの要請に準拠したりするためです。
古いファイルを物理的に削除するには、VACUUMを実行します。REORG TABLE ... APPLY (PURGE) オペレーションの完了時に、テーブルの新しいバージョンが作成されます。以前のテーブルバージョンから削除されたファイルを完全に削除するには、VACUUM の保持しきい値をパージ操作の完了タイムスタンプに設定する必要があります。メタデータのみの削除をパージしてデータ書き換えを強制するを参照してください。
大規模なテーブルのパフォーマンスを向上させる
大規模なテーブルで論理的に削除されたデータをパージする際の性能を向上させるには、spark.databricks.delta.reorg.purgeMode を rows に設定します。例えば、この設定は、REORG TABLE ... APPLY (PURGE) を使用して手動でデータをパージする場合、または ALTER TABLE DROP FEATURE deletionVectors を使用して削除ベクトルを削除する場合に構成します。
デフォルトでは、spark.databricks.delta.reorg.purgeMode は all に設定されています。大規模なテーブルでは、パージ操作が削除された列データと論理削除された行の両方を確認するためにすべてのParquetファイルのフッターをスキャンする必要があるため、この操作は低速になる可能性があります。
rows の値は、論理的に削除された行を含むファイルのみを処理するように操作を制限します。大規模なテーブルでは、多くのファイルが論理削除された行を含まず、そのテーブルに削除された列がない場合、パフォーマンスが向上する可能性があります。
クライアントの互換性
Databricks は、削除ベクトルを使用して、Photon対応コンピュートの更新のための予測I/Oを強化します。 予測 I/O を使用して更新を高速化するを参照してください。
削除ベクトルを用いた読み取りと書き込みのサポートは、クライアントによって異なります。
次の表は、削除ベクトルが有効なテーブルの読み書きに必要なクライアントのバージョンと、どの書き込み操作で削除ベクトルが使用されるかを示しています。
クライアント | 削除ベクトルを書き込みます | 削除ベクトルを読み取る |
|---|---|---|
Databricks Runtime (Photonを含む) | Databricks Runtime 12.2 LTS 以上を使用して、 | Databricks Runtime 12.2 LTS 以上が必要です。 |
Databricks Runtime(Photon なし) | Databricks Runtime 12.2 LTS 以上を使用する | Databricks Runtime 12.2 LTS 以上が必要です。 |
OSS Apache Spark と OSS Delta Lake | OSS Delta 2.4.0以降を使用して、 | OSS Delta 2.3.0 以上が必要です。 |
OpenSharingの受信者 | OpenSharing テーブルでは、書き込みはサポートされていません。 | Databricks:Databricks Runtime 14.1以上が必要です。オープンソースの Apache Spark: |
他のクライアントのサポートについては、OSS Delta Lake インテグレーションのドキュメントを参照してください。
制限事項:
- UniForm Iceberg v2 は削除ベクトルをサポートしていません。Apache Iceberg v3 は UniForm が有効なテーブルで削除ベクトルをサポートしています。Apache Iceberg v3 機能を使用を参照してください。
- 削除ベクトルを使用するファイルを持つテーブルに対して、「GENERATEステートメント」を使用してマニフェストファイルを生成することはできません。マニフェストを生成するには、最初にREORG TABLE … APPLY (PURGE) ステートメントを実行し、その後、
GENERATEステートメントを実行します。REORGステートメントを発行する際には、並列書き込み操作が実行中でないことを確認する必要があります。 - 削除ベクトルが有効になっているテーブルに対して、マニフェストファイルをインクリメンタルに生成することはできません(たとえば、テーブル プロパティ
delta.compatibility.symlinkFormatManifest.enabled=trueを設定することによって)。 - マテリアライズドビューまたはストリーミングテーブルで削除ベクトルを有効にし、その後、削除ベクトルを削除しても、削除ベクトルはビューまたはテーブルへの今後の書き込みには適用されません。ただし、既存の削除ベクトルは残ります。
- マテリアライズドビューまたはストリーミングテーブルで削除ベクトルを有効にした後で、テーブルプロトコルをダウングレードすることはできません。有効化した後は、ビューまたはテーブルで削除ベクトルを無効にした場合でも、削除ベクトルのテーブル機能を削除することはできません。