

# 使用成本型优化器
<a name="cost-based-optimizer"></a>

您可以使用 Athena SQL 中的成本型优化器（CBO）功能来优化查询。您可以选择请求 Athena 为 AWS Glue 中的一个表收集表级或列级统计数据。如果查询中的所有表都有统计数据，Athena 会使用这些统计数据来创建它认为性能最佳的执行计划。查询优化器会根据统计模型来计算备选计划，然后选择速度可能最快的计划来运行查询。

AWS Glue 表上的统计数据被收集并存储在 AWS Glue Data Catalog 中，也提供给 Athena 来改进查询计划和执行。这些统计数据是列级统计数据，例如 Parquet、ORC、JSON、ION、CSV 和 XML 等文件类型的不同值、空值、最大值和最小值的个数。Amazon Athena 通过在查询处理中尽早应用最严格的筛选条件来使用这些统计数据优化查询。这种筛选功能限制了内存使用量和为提供查询结果而必须读取的记录数。

Athena 还会将 CBO 和规则型优化器（RBO）功能结合起来使用。RBO 以机械方式应用可提高查询性能的规则。RBO 通常会带来益处，因为它的转换是为了简化查询计划。不过，由于 RBO 不进行成本计算或计划比较，查询较复杂便会让 RBO 难以创建最佳计划。

因此，Athena 会同时使用 RBO 和 CBO 来优化您的查询。在确定改进查询执行的机会后，Athena 就会创建最佳计划。有关执行计划详情的信息，请参阅[查看 SQL 查询的执行计划](query-plans.md)。有关 CBO 如何工作的详细讨论，请参阅 AWS 大数据博客中的 [Speed up queries with the cost-based optimizer in Amazon Athena](https://aws.amazon.com/blogs/big-data/speed-up-queries-with-cost-based-optimizer-in-amazon-athena/)。

要为 AWS Glue Catalog 表生成统计数据，可以使用 Athena 控制台、AWS Glue 控制台或 AWS Glue API。由于 Athena 已与 AWS Glue Catalog 集成，在运行来自 Amazon Athena 的查询时，您会自动获得相应的查询性能改进。

## 注意事项和限制
<a name="cost-based-optimizer-considerations-and-limitations"></a>
+ **表类型** – 目前，Athena 中的 CBO 功能仅支持 AWS Glue Data Catalog 中的 Hive 和 Iceberg 表。
+ **Athena for Spark** – CBO 功能在 Athena for Spark 中不可用。
+ **定价** – 有关定价信息，请访问 [AWS Glue 定价页面](https://aws.amazon.com/glue/pricing)。

## 使用 Athena 控制台生成表统计数据
<a name="cost-based-optimizer-generating-table-statistics-using-the-athena-console"></a>

本节旨在介绍如何使用 Athena 控制台为 AWS Glue 中的表生成表级或列级统计数据。有关使用 AWS Glue 生成表统计数据的信息，请参阅《AWS Glue Developer Guide》**中的 [Working with column statistics](https://docs.aws.amazon.com/glue/latest/dg/column-statistics.html)。

**使用 Athena 控制台为表生成统计数据**

1. 从 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 打开 Athena 控制台。

1. 在 Athena 查询编辑器的**表**列表中，选择所需表的三个垂直点，然后选择**生成统计数据**。  
![\[Athena 查询编辑器中表的上下文菜单。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/cost-based-optimizer-1.png)

1. 在**生成统计数据**对话框中，选择**所有列**为表中的所有列生成统计数据，或者选择**所选列**来选择特定列。**所有列**为默认设置。  
![\[“生成统计数据”对话框。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/cost-based-optimizer-2.png)

1. 对于 **AWS Glue 服务角色**，创建服务角色或选择现有服务角色来授予 AWS Glue 生成统计数据的权限。对于包含表数据的 Amazon S3 存储桶，AWS Glue 服务角色还需要 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html) 权限。  
![\[选择 AWS Glue 服务角色。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/cost-based-optimizer-3.png)

1. 选择**生成统计数据**。**为 *table\$1name* 生成统计数据**通知横幅显示任务状态。  
![\[“生成统计数据”通知横幅。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/cost-based-optimizer-4.png)

1. 要在 AWS Glue 控制台中查看详细信息，请选择**在 Glue 中查看**。

   有关在 AWS Glue 控制台中查看统计数据的信息，请参阅《AWS Glue 开发人员指南**》中的 [Viewing column statistics](https://docs.aws.amazon.com/glue/latest/dg/view-column-stats.html)。

1. 生成统计数据后，包含统计数据的表和列在括号中显示**统计数据**一词，如下图所示。  
![\[在 Athena 查询编辑器中显示统计数据图标的表。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/cost-based-optimizer-5.png)

现在，如果运行查询，Athena 会对生成统计数据的表和列执行基于成本的优化。

## 启用和禁用表统计数据
<a name="cost-based-optimizer-enabling-iceberg-table-statistics"></a>

按照上一节中的步骤为 Iceberg 表生成表统计数据时，会自动向 AWS Glue Data Catalog 中的 Iceberg 表添加一个称为 `use_iceberg_statistics` 的 Glue 表属性，默认设置为 **true**。如果删除了该属性或将其设置为 **false**，则即使 Glue 生成了统计数据，CBO 在查询执行期间尝试优化查询计划时也不会使用 Iceberg 表统计数据。关于如何生成表统计数据的更多信息，请参阅[使用 Athena 控制台生成表统计数据](#cost-based-optimizer-generating-table-statistics-using-the-athena-console)。

相比之下，Glue 数据目录中的 Hive 表没有启用或禁用 CBO 使用表统计数据的类似表属性。因此，CBO 在尝试优化 Hive 表的查询计划时会始终使用 Glue 生成的表统计数据。

## 其他资源
<a name="cost-based-optimizer-additional-resources"></a>

有关更多信息，请参阅以下资源。

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/zUHEXJdHUxs?si=rMAhJj3I5IlhN-1R/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/zUHEXJdHUxs?si=rMAhJj3I5IlhN-1R)
