使用 Delta Lake VACUUM 命令永久删除 Delta 表不再引用且早于保留期限的数据文件。
在 Microsoft Fabric 中,VACUUM有助于在更新、删除、合并和压缩操作后清理 Microsoft OneLake 中的过时文件。 它可以减少存储消耗,删除Fabric不再需要活动表状态的过时文件,并在维护操作(如 OPTIMIZE)后回收空间。
VACUUM遵循你可能从开源 Delta Lake 中了解的相同核心 Delta Lake 概念,但在 Fabric Spark 体验(如笔记本、Spark 作业定义和 Lakehouse Maintenance UI)中运行它。
VACUUM 删除的内容
Delta 表跟踪构成 Delta 日志中当前表状态的文件。 当 UPDATE、DELETE、MERGE、覆盖写入或压缩等操作用较新的 Parquet 文件替换旧文件时,旧文件可能会变得不再被引用。
VACUUM 仅当这两个条件均为 true 时,才删除这些未引用的文件:
- Delta 日志不再引用这些文件。
- 文件早于配置的保留阈值。
由于 VACUUM 永久删除 OneLake 中的文件,因此在仍需要较旧的表版本时,请谨慎使用它。
为什么 VACUUM 很重要
当您想要执行以下操作时,请运行VACUUM:
- 通过从 OneLake 中删除过时的文件来降低存储成本
- 在更新、删除和合并操作后回收空间
- 在
OPTIMIZE创建替换文件后清理压缩前文件 - 防止长时间运行的生产表累积不必要的过时数据文件
VACUUM 本身并不会像压实或文件布局优化那样提高查询性能。 其主要用途是清理存储空间。
运行 VACUUM 的位置
VACUUM 是 Fabric 中的 Spark 命令。 在使用 Spark 引擎的环境中运行它,例如:
- Fabric 笔记本
- Spark 任务定义
- Lakehouse 的维护用户界面和基于管道的维护工作流
请勿在 SQL 分析终结点或仓库 SQL 编辑器中运行 VACUUM 。 这些体验不支持 Spark Delta 的维护命令。
如果您希望使用基于门户的工作流,请参阅 Lakehouse 表维护。
注释
在笔记本中,请在 Spark SQL 单元格中运行 SQL 示例,在 PySpark 单元格中运行 Python 示例,并在 Scala 单元格中运行 Scala 示例。
语法示例
在 Fabric 中运行 VACUUM 时,请使用以下示例。
清空默认保留期的表
清空具有自定义保留阈值的表
使用 DRY RUN 预览文件
用于 DRY RUN 列出将在不实际删除的情况下删除的文件。
VACUUM schema_name.table_name DRY RUN
还可以合并 RETAIN 和 DRY RUN。
VACUUM schema_name.table_name RETAIN 168 HOURS DRY RUN
在 LITE 模式下清空
VACUUM LITE 是一种更快的替代方法,它仅使用 Delta 事务日志来标识未引用的文件,而不是列出表目录中的每一个文件。 对于包含多个文件的大型表,此方法要快得多。
VACUUM schema_name.table_name LITE
VACUUM schema_name.table_name LITE RETAIN 168 HOURS
VACUUM LITE 通过读取 Delta 日志而不是执行完整目录列表来标识要删除的文件。 它更快,但需要足够的日志历史来确定哪些文件未被引用。 如果 Delta 日志被裁剪得超出了 LITE 模式所需的范围,则会引发 DELTA_CANNOT_VACUUM_LITE 异常——在这种情况下,将回退为标准的 VACUUM(完整模式)。
注释
VACUUM LITE 在 Fabric Spark 运行时 2.0(Delta 4.1)或更高版本中受支持。 验证Fabric运行时版本是否支持此功能。
使用清单表进行吸尘
对于即使是默认 VACUUM 完整目录列表速度缓慢的非常大的表,也可以提供预先计算的文件清单。
VACUUM 不会在运行时列出表目录,而是从你提供的清单中读取文件路径。
VACUUM schema_name.table_name USING INVENTORY inventory_table_name
VACUUM schema_name.table_name USING INVENTORY (SELECT * FROM inventory_table_name WHERE path LIKE 'abfss://%')
清单表(或查询)必须具有以下架构:
| 列 | 类型 | Description |
|---|---|---|
path |
字符串 | 完全限定的文件 URI。 |
length |
整数 | 文件大小(以字节为单位)。 |
isDir |
布尔 | 条目是否为目录。 |
modificationTime |
整数 | 自纪元以来的文件上次修改时间(以毫秒为单位)。 |
可以从 OneLake 文件元数据、存储帐户清单报表或按计划列出表目录的自定义 Spark 作业填充清单表。 这会将昂贵的文件列表步骤与 VACUUM 操作本身分离。
默认保留期
如果未指定保留间隔, VACUUM 则使用默认保留期为 7 天,即 168 小时。
在删除旧文件之前,该默认值为活动读取者、编写器和时间旅行查询提供了更安全的窗口。
短期保留期的安全检查
Delta Lake 包含由 spark.databricks.delta.retentionDurationCheck.enabled 控制的保留期安全检查。
如果您尝试使用少于 7 天的保留期,该安全检查会发出警告,除非您在 Spark 配置中明确禁用此检查。
在禁用此保护之前,请谨慎使用。 较短的保留时段可以删除并发工作负荷或恢复方案仍需要的文件。
例如,这些命令请求一天的保留期:
如果您的环境启用了安全检查,运行时会对低于七天的保留设置发出警告。
了解时间旅行的影响
只要所需的历史文件仍然存在,Delta Lake 时间旅行就可以查询旧表版本。
VACUUM 会删除早于保留窗口的文件,因此也会删除超出该窗口的时间回溯所需的数据文件。 清空这些文件后,无法再查询这些旧版本。
在减少保留期之前,请确定工作负荷、审核、调试步骤和恢复过程需要多少历史访问权限。 有关详细信息,请参阅 时间旅行。
了解对删除向量的影响
删除向量可以将行标记为已删除,而无需立即重写每个受影响的数据文件。 由于此行为,看起来旧的文件可能仍属于活动表状态。
VACUUM 不会删除仍在引用的文件,包括仍然有效的文件,因为删除向量元数据仍指向这些文件。 如果使用删除向量,并在之后重新组织或优化该表,则在这些更改完成后,可能会有更多过时的文件符合 VACUUM 的条件。
若要以物理方式重写受删除向量影响的数据,请参阅 REORG Delta 表。
遵循最佳做法
在 Fabric 中运行 VACUUM 时,请使用以下做法:
- 运行
VACUUM后OPTIMIZE删除不再需要的预压缩文件。 - 除非你清楚了解这会对时间旅行、读取器、写入器和恢复操作产生什么影响,否则不要将保留期设为低于 7 天。
- 在生产管道中定期执行
VACUUM操作,以免陈旧文件在 OneLake 中堆积。 - 在缩短保留期之前,请先确定您对时间旅行功能的需求。
- 如果要验证要删除的文件,请先使用
DRY RUN。
有关 Fabric 范围内的维护指南,请参阅 表维护概述 和 Lakehouse 表维护。
了解 VACUUM 不会删除哪些内容
VACUUM 删除过时的数据文件,但不会删除文件夹中的 _delta_log Delta 日志文件。
Delta 日志清理遵循检查点和日志保留行为,这与 VACUUM 是分开的。