

# VACUUM
<a name="vacuum-statement"></a>

`VACUUM` 语句通过执行[快照过期](https://iceberg.apache.org/docs/latest/spark-procedures/#expire_snapshots)和[孤立文件删除](https://iceberg.apache.org/docs/latest/spark-procedures/#remove_orphan_files)来对 Apache Iceberg 表进行表维护。

**注意**  
`VACUUM` 是事务性的，仅支持用于 Athena 引擎版本 3 中的 Apache Iceberg 表。

`VACUUM` 语句通过减少存储消耗来优化 Iceberg 表。有关使用 `VACUUM` 的更多信息，请参阅[优化 Iceberg 表](querying-iceberg-data-optimization.md)。请注意，由于 `VACUUM` 语句会对 Amazon S3 进行 API 调用，因此对向 Amazon S3 发出的相关请求会产生费用。

**警告**  
如果您运行快照过期操作，则无法对过期快照进行时间旅行操作。

## 摘要
<a name="vacuum-statement-synopsis"></a>

要删除 Iceberg 表不再需要的数据文件，请使用以下语法。

```
VACUUM [{{database_name}}.]{{target_table}}
```
+ `VACUUM` 希望 Iceberg 数据位于 Amazon S3 文件夹中，而不是 Amazon S3 存储桶中。例如，如果 Iceberg 数据位于 `s3://amzn-s3-demo-bucket`/ 而不是 `s3://amzn-s3-demo-bucket/myicebergfolder/`，则 `VACUUM` 语句会失败并显示错误消息 GENERIC\_INTERNAL\_ERROR：文件系统位置中缺少路径：`s3://amzn-s3-demo-bucket`。
+ 为使 `VACUUM` 能够删除数据文件，查询执行角色必须对 Iceberg 表、元数据、快照和数据文件所在的存储桶拥有 `s3:DeleteObject` 权限。如果该权限不存在，则 `VACUUM` 查询将成功，但不会删除文件。
+ 要在名称以下划线开头的表（例如 `_mytable`）上运行 `VACUUM`，请将表名括在反引号中，如以下示例所示。如果在表名前面加上数据库名称，请不要将数据库名称括在反引号中。请注意，双引号不能代替反引号。

  这种行为是 `VACUUM` 特有的。对于以下划线开头的表名，`CREATE` 和 `INSERT INTO` 语句不要求使用反引号。

  ```
  VACUUM `_mytable`
  VACUUM my_database.`_mytable`
  ```

## 执行的操作
<a name="vacuum-statement-operations-performed"></a>

`VACUUM` 执行以下操作：
+ 删除超过 `vacuum_max_snapshot_age_seconds` 表属性指定时间的快照。默认情况下，该属性设置为 432000 秒（5 天）。
+ 删除不在保留期限内且超过 `vacuum_min_snapshots_to_keep` 表属性指定数量的快照。默认 为 1。

  您可以在 `CREATE TABLE` 语句中指定这些表属性。创建表后，您可以使用 [ALTER TABLE SET TBLPROPERTIES](querying-iceberg-alter-table-set-properties.md) 语句对其进行更新。
+ 删除所有由于快照删除而无法访问的元数据和数据文件。您可以通过设置 `vacuum_max_metadata_files_to_keep` 表属性来配置要保留的旧元数据文件的数量。默认值是 100。
+ 删除超过 `vacuum_max_snapshot_age_seconds` 表属性中指定时间的孤立文件。孤立文件是表数据目录中不属于表状态的文件。

有关在 Athena 中创建和管理 Apache Iceberg 表的更多信息，请参阅 [创建 Iceberg 表](querying-iceberg-creating-tables.md) 和 [管理 Iceberg 表](querying-iceberg-managing-tables.md)。