

# 优化 Iceberg 表
<a name="querying-iceberg-data-optimization"></a>

Athena 提供多项优化功能来提升 Apache Iceberg 表的查询性能。随着数据的积累，由于文件处理开销增加以及应用存储在 Iceberg 删除文件中的行级删除的计算成本，查询效率可能会降低。为了应对这些挑战，Athena 支持手动压缩和清空运算符来优化表结构。Athena 还使用 Iceberg 统计数据来实现基于成本的查询优化，以及使用 Parquet 列索引在查询执行期间进行精确的数据修剪。这些功能协同工作，可以缩短查询执行时间，最大限度地减少数据扫描并降低成本。本主题介绍如何使用这些优化功能，保持对 Iceberg 表的高性能查询。

## OPTIMIZE
<a name="querying-iceberg-data-optimization-rewrite-data-action"></a>

`OPTIMIZE table REWRITE DATA` 压缩操作根据数据文件的大小和相关删除文件的数量将数据文件重写为更优化的布局。有关语法和表属性的详细信息，请参见 [OPTIMIZE](optimize-statement.md)。

### 示例
<a name="querying-iceberg-data-optimization-example"></a>

以下示例将删除文件合并到数据文件中，然后生成接近目标文件大小的文件，其中 `category` 的值为 `c1`。

```
OPTIMIZE iceberg_table REWRITE DATA USING BIN_PACK
  WHERE category = 'c1'
```

## VACUUM
<a name="querying-iceberg-vacuum"></a>

`VACUUM` 会执行[快照过期](https://iceberg.apache.org/docs/latest/spark-procedures/#expire_snapshots)和[孤立文件删除](https://iceberg.apache.org/docs/latest/spark-procedures/#remove_orphan_files)。这些操作会减小元数据大小，并删除不处于当前表状态且早于为表指定的保留期的文件。有关语法的详细信息，请参阅 [VACUUM](vacuum-statement.md)。

### 示例
<a name="querying-iceberg-vacuum-example"></a>

以下示例使用表属性将表 `iceberg_table` 配置为保留最近三天的数据，然后使用 `VACUUM` 使旧快照过期并从表中删除孤立文件。

```
ALTER TABLE iceberg_table SET TBLPROPERTIES (
  'vacuum_max_snapshot_age_seconds'='259200'
)

VACUUM iceberg_table
```

## 使用 Iceberg 表统计数据
<a name="querying-iceberg-data-optimization-statistics"></a>

Athena 基于成本的优化器使用 Iceberg 统计数据来生成最佳查询计划。为您的 Iceberg 表生成统计数据后，Athena 会自动使用这些信息进行关于联接排序、筛选及聚合行为的智能决策，这通常可以提升查询性能并降低成本。

使用 S3 表时，Iceberg 统计数据默认已开启。对于其他 Iceberg 表，Athena 使用表属性 `use_iceberg_statistics` 来确定是否利用统计数据进行基于成本的优化。要开始使用，请参阅《AWS Glue 用户指南》**中的[使用列统计数据优化查询性能](https://docs.aws.amazon.com//glue/latest/dg/column-statistics.html)，或者使用 [Athena 控制台](https://docs.aws.amazon.com/athena/latest/ug/cost-based-optimizer.html)基于 Iceberg 表按需生成统计数据。

## 使用 Parquet 列索引
<a name="querying-iceberg-data-optimization-parquet-column-indexing"></a>

Parquet 列索引使 Athena 能够在查询执行期间通过利用页面级最小/最大统计数据以及行组级统计数据来执行更精确的数据修剪。这使得 Athena 可以跳过行组中不必要的页面，从而显著减少扫描的数据量并提升查询性能。其最适合对已排序的列使用选择性筛选谓词的查询，能够缩短执行时间和提升数据扫描效率，同时减少 Athena 需要从 Amazon S3 读取的数据量。

如果底层 Parquet 文件中存在列索引，则 Athena 默认在 S3 表中使用 Parquet 列索引。对于其他 Iceberg 表，Athena 使用 `use_iceberg_parquet_column_index` 属性确定是否使用 Parquet 文件中的列索引。使用 AWS Glue 控制台或 `UpdateTable` API 设置此表属性。