Delta 表的删除向量

删除向量允许 Delta Lake 将单个行标记为已删除,而无需重写包含这些行的整个 Parquet 文件。 在Microsoft Fabric中,此功能可帮助你更高效地处理行级更改,尤其是在处理大型 Delta 表时。

Delta Lake 不会因为一次小规模删除或更新就替换整个数据文件,而是将行级删除信息单独存储。 然后,查询引擎使用该元数据忽略受影响的行。

删除向量的作用

删除向量是 Delta 表数据文件的配套文件。 它记录了 Parquet 文件中哪些行位置已失效。

此设计可在行级别启用软删除,以实现更快的更新、合并和删除:

  • 原始 Parquet 文件保持不变。
  • Delta 写入一个很小的删除向量文件。
  • 读取器在查询时跳过标记的行。

由于数据文件不需要立即重写,因此当更改影响大型文件中少量数据时,删除向量特别有用。

删除向量的工作原理

当你运行 DELETEUPDATEMERGE 时,Delta 会识别出需要更改的行。

如果启用删除向量,Delta 可以在删除向量中记录受影响的行,而不是立即重写完整的 Parquet 文件。

该过程运行方式如下:

  1. Delta 会找出目标 Parquet 文件中已删除或被替换的行。
  2. Delta 写入一个删除向量文件,该文件将这些特定行标记为无效。
  3. 原始 Parquet 文件在 OneLake 中保持不变。
  4. Fabric 读取器会读取删除向量,并在执行查询时跳过已标记的行。

对于 UPDATEMERGE,Delta 仍根据需要写入新行。 关键好处是,它可以避免在原始文件中重写未更改的行。

为什么删除向量有所帮助

对于频繁进行小规模行级更改的工作负载,删除向量可提高写入效率。

它们之所以有帮助,是因为:

  • 加快涉及相对较少行的 DELETEUPDATEMERGE 操作
  • 降低写入放大,因为 Delta Lake 不需要为每次小改动重写整个 Parquet 文件
  • 当仅有一小部分行发生更改时,可降低大文件的 I/O

此行为通常非常适合缓慢更改维度、更新插入管道、清理作业和接收频繁更正的操作表。

启用删除向量

注释

从 Fabric Spark 运行时 2.0(Delta 4.1)开始,默认启用删除向量。

可以通过设置 Delta 表属性在表级别启用删除向量。

CREATE TABLE sales.orders (
  order_id BIGINT,
  customer_id BIGINT,
  order_status STRING,
  order_date DATE
)
USING DELTA
TBLPROPERTIES ('delta.enableDeletionVectors' = true)

还可以在现有表上启用删除向量。

ALTER TABLE sales.orders
SET TBLPROPERTIES ('delta.enableDeletionVectors' = true)

为当前会话中新建的所有表启用删除向量

若要为 Spark 会话期间创建的每个新表默认启用删除向量,请设置会话级别配置:

SET spark.databricks.delta.properties.defaults.enableDeletionVectors = TRUE

应用此设置后创建的任何表都已启用删除向量,而无需单独指定表属性。

了解性能权衡

删除向量通常能加快写入速度,但会在读取时带来一定的权衡。

写入性能

写入速度通常更快,因为当只有几行发生更改时,Delta Lake 可以避免重写整个文件。

读取性能

读取可能会产生轻微的开销,因为引擎必须在扫描数据文件时检查删除向量元数据并跳过无效行。

对于许多工作负载而言,这部分开销与写入节省相比微不足道。 但是,如果删除向量随着时间的推移累积,额外的元数据检查可能会减慢读取速度。

使用 REORG PURGE 删除累积删除向量

OPTIMIZE 会自动清理其中超过 5% 的记录被删除向量引用的文件,因此常规压缩操作通常无需单独步骤即可完成删除向量清理。

当你需要明确控制已软删除的行何时被物理删除时,请使用 REORG TABLE ... APPLY (PURGE);例如,为了满足合规或 GDPR 要求,或者强制清除低于 OPTIMIZE 使用的 5% 阈值的文件。

PURGE 重写受影响的数据文件,从当前的 Parquet 文件中删除被软删除的行,并删除与这些被重写文件相关的删除向量文件。

REORG TABLE sales.orders APPLY (PURGE)

当您有特定需求,需要在软删除行所占比例低于 5% 阈值时强制移除这些行,或者合规要求必须按预定时间表进行物理删除时,请运行 PURGE。 对于大多数工作负载,OPTIMIZE 已足以自动处理删除向量的清理。

比较 REORG、OPTIMIZE 和 VACUUM

这些命令协同工作,但它们执行不同的作业。

REORG 表...应用(清除)

REORG TABLE ... APPLY (PURGE) 重写受影响的文件,并物理删除此前仅被软删除的行。

优化

OPTIMIZE 压缩小型文件以提高扫描效率。 它还会自动清除删除向量引用超过 5% 记录的文件。 该行为使 OPTIMIZE 成为用于大多数删除向量清理的主要维护命令。

真空

VACUUM 会删除超过保留期限且未被引用的文件。 在其他操作使其过时后,该清理可以包括删除向量文件。

常见模式为:

  1. 使用删除向量提高行级写入效率。
  2. 定期运行 OPTIMIZE 以压缩文件,并自动清除超过 5% 阈值的删除矢量。
  3. 仅当您需要强制移除低于该阈值的软删除项,或出于合规要求时,才运行 REORG TABLE ... APPLY (PURGE)
  4. 稍后运行 VACUUM 以删除超过保留期的未引用文件。

检查协议兼容性

删除向量需要 Delta 读取器版本 3 和写入器版本 7。

在表上启用删除向量后,不支持删除向量的较旧读取器无法正确读取该表。 在广泛启用该功能之前,请验证读取表的每个引擎和运行时是否支持所需的 Delta 协议。

可以通过使用诸如 DESCRIBE DETAIL 之类的命令,以及查看 Delta 日志中的表属性,来检查协议相关的元数据。

遵循最佳做法

  • 为频繁进行小型删除、更新或合并的表启用删除向量。
  • OPTIMIZE 自动清除包含删除向量引用的记录数超过 5% 的文件,因此不需要单独的 PURGE 步骤。
  • 仅在您需要显式控制时才使用 REORG TABLE ... APPLY (PURGE),例如出于合规要求,或需要对低于 5% 阈值的对象执行强制清退。
  • 仅当过时的删除向量文件不再被引用且超过保留期限阈值后,才能使用 VACUUM 清理这些文件。
  • 在共享表上启用删除向量之前,确认所有读取器都支持读取器版本 3 和编写器版本 7 或 v2 检查点协议。