删除向量允许 Delta Lake 将单个行标记为已删除,而无需重写包含这些行的整个 Parquet 文件。 在Microsoft Fabric中,此功能可帮助你更高效地处理行级更改,尤其是在处理大型 Delta 表时。
Delta Lake 不会因为一次小规模删除或更新就替换整个数据文件,而是将行级删除信息单独存储。 然后,查询引擎使用该元数据忽略受影响的行。
删除向量的作用
删除向量是 Delta 表数据文件的配套文件。 它记录了 Parquet 文件中哪些行位置已失效。
此设计可在行级别启用软删除,以实现更快的更新、合并和删除:
- 原始 Parquet 文件保持不变。
- Delta 写入一个很小的删除向量文件。
- 读取器在查询时跳过标记的行。
由于数据文件不需要立即重写,因此当更改影响大型文件中少量数据时,删除向量特别有用。
删除向量的工作原理
当你运行 DELETE、UPDATE 或 MERGE 时,Delta 会识别出需要更改的行。
如果启用删除向量,Delta 可以在删除向量中记录受影响的行,而不是立即重写完整的 Parquet 文件。
该过程运行方式如下:
- Delta 会找出目标 Parquet 文件中已删除或被替换的行。
- Delta 写入一个删除向量文件,该文件将这些特定行标记为无效。
- 原始 Parquet 文件在 OneLake 中保持不变。
- Fabric 读取器会读取删除向量,并在执行查询时跳过已标记的行。
对于 UPDATE 和 MERGE,Delta 仍根据需要写入新行。 关键好处是,它可以避免在原始文件中重写未更改的行。
为什么删除向量有所帮助
对于频繁进行小规模行级更改的工作负载,删除向量可提高写入效率。
它们之所以有帮助,是因为:
- 加快涉及相对较少行的
DELETE、UPDATE和MERGE操作 - 降低写入放大,因为 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 会话期间创建的每个新表默认启用删除向量,请设置会话级别配置:
应用此设置后创建的任何表都已启用删除向量,而无需单独指定表属性。
了解性能权衡
删除向量通常能加快写入速度,但会在读取时带来一定的权衡。
写入性能
写入速度通常更快,因为当只有几行发生更改时,Delta Lake 可以避免重写整个文件。
读取性能
读取可能会产生轻微的开销,因为引擎必须在扫描数据文件时检查删除向量元数据并跳过无效行。
对于许多工作负载而言,这部分开销与写入节省相比微不足道。 但是,如果删除向量随着时间的推移累积,额外的元数据检查可能会减慢读取速度。
使用 REORG PURGE 删除累积删除向量
OPTIMIZE 会自动清理其中超过 5% 的记录被删除向量引用的文件,因此常规压缩操作通常无需单独步骤即可完成删除向量清理。
当你需要明确控制已软删除的行何时被物理删除时,请使用 REORG TABLE ... APPLY (PURGE);例如,为了满足合规或 GDPR 要求,或者强制清除低于 OPTIMIZE 使用的 5% 阈值的文件。
PURGE 重写受影响的数据文件,从当前的 Parquet 文件中删除被软删除的行,并删除与这些被重写文件相关的删除向量文件。
当您有特定需求,需要在软删除行所占比例低于 5% 阈值时强制移除这些行,或者合规要求必须按预定时间表进行物理删除时,请运行 PURGE。 对于大多数工作负载,OPTIMIZE 已足以自动处理删除向量的清理。
比较 REORG、OPTIMIZE 和 VACUUM
这些命令协同工作,但它们执行不同的作业。
REORG 表...应用(清除)
REORG TABLE ... APPLY (PURGE) 重写受影响的文件,并物理删除此前仅被软删除的行。
优化
OPTIMIZE 压缩小型文件以提高扫描效率。 它还会自动清除删除向量引用超过 5% 记录的文件。 该行为使 OPTIMIZE 成为用于大多数删除向量清理的主要维护命令。
真空
VACUUM 会删除超过保留期限且未被引用的文件。 在其他操作使其过时后,该清理可以包括删除向量文件。
常见模式为:
- 使用删除向量提高行级写入效率。
- 定期运行
OPTIMIZE以压缩文件,并自动清除超过 5% 阈值的删除矢量。 - 仅当您需要强制移除低于该阈值的软删除项,或出于合规要求时,才运行
REORG TABLE ... APPLY (PURGE)。 - 稍后运行
VACUUM以删除超过保留期的未引用文件。
检查协议兼容性
删除向量需要 Delta 读取器版本 3 和写入器版本 7。
在表上启用删除向量后,不支持删除向量的较旧读取器无法正确读取该表。 在广泛启用该功能之前,请验证读取表的每个引擎和运行时是否支持所需的 Delta 协议。
可以通过使用诸如 DESCRIBE DETAIL 之类的命令,以及查看 Delta 日志中的表属性,来检查协议相关的元数据。
遵循最佳做法
- 为频繁进行小型删除、更新或合并的表启用删除向量。
-
OPTIMIZE自动清除包含删除向量引用的记录数超过 5% 的文件,因此不需要单独的PURGE步骤。 - 仅在您需要显式控制时才使用
REORG TABLE ... APPLY (PURGE),例如出于合规要求,或需要对低于 5% 阈值的对象执行强制清退。 - 仅当过时的删除向量文件不再被引用且超过保留期限阈值后,才能使用
VACUUM清理这些文件。 - 在共享表上启用删除向量之前,确认所有读取器都支持读取器版本 3 和编写器版本 7 或 v2 检查点协议。