

# 在 Athena 中重复使用查询结果
<a name="reusing-query-results"></a>

在 Athena 中重新运行查询时，可以选择重用上次存储的查询结果。此选项可以提高性能并降低扫描字节数方面的成本。重用查询结果非常有用，例如，如果您知道结果在指定时间范围内不会发生变化，则可以指定重用查询结果的最大期限。只要存储结果不超过指定期限，Athena 就会使用该结果。有关更多信息，请参阅 *Amazon 大数据博客*中的[使用 Amazon Athena 降低成本并提高查询性能](https://www.amazonaws.cn/blogs/big-data/reduce-cost-and-improve-query-performance-with-amazon-athena-query-result-reuse/)。

## 主要 功能
<a name="reusing-query-results-key-features"></a>

当您为查询启用结果重用时，Athena 会在同一工作组中查找该查询的先前执行情况。如果 Athena 找到匹配项，它将绕过执行并返回上一个匹配执行的查询结果。您可以针对每个查询启用查询结果重用。

满足以下所有条件时，Athena 将重复使用上一次查询的结果：
+ 查询字符串匹配由 Athena 确定。
+ 数据库与目录名称匹配。
+ 先前的结果尚未过期。
+ 查询结果配置与上一次执行的查询结果配置相匹配。
+ 您可以访问查询中引用的所有表。
+ 您可以访问存储先前结果的 S3 文件位置。

如果不满足这些条件中的任何一个，Athena 将在不使用缓存结果的情况下运行查询。

## 注意事项和限制
<a name="reusing-query-results-considerations-and-limitations"></a>

使用查询结果重用功能时，请记住以下几点：
+ Athena 仅在同一工作组内重用查询结果。
+ 重用查询结果功能遵循工作组配置。如果您覆盖查询的结果配置，该功能将被禁用。
+ 仅支持在 Amazon S3 上生成结果集的查询。不支持 `SELECT` 和 `EXECUTE` 以外的语句。
+ 支持向 Amazon Glue 注册 Apache Hive、Apache Hudi、Apache Iceberg 和 Linux Foundation Delta Lake 表。不支持外部 Hive 元存储。
+ 不支持引用联合目录或外部 Hive 元存储的查询。
+ Lake Formation 受管表不支持查询结果重用。
+ 在 Lake Formation 中将表源的 Amazon S3 位置注册为数据位置时，不支持重用查询结果。
+ 不支持具有行和列权限的表。
+ 不支持具有精细访问控制（例如，列或行筛选）的表。
+ 任何引用不支持的表的查询都不能重用查询结果。
+ Athena 要求您具有 Amazon S3 读取权限，以便重用先前生成的输出文件。
+ 重用查询结果功能假定先前结果的内容未被修改。Athena 在使用先前的结果之前，不会检查其完整性。
+ 如果先前执行的查询结果已被删除或移至 Amazon S3 中的其他位置，则随后执行的同一查询将不会重用查询结果。
+ 因而可能会返回过时的结果。在达到指定的最大重用期限之前，Athena 不会检查源数据是否更改。
+ 如果有多个结果可供重用，Athena 会使用最新的结果。
+ 使用非确定性运算符或函数（例如 `rand()` 或 `shuffle()`）的查询不使用缓存结果。例如，不包含 `ORDER BY` 的 `LIMIT` 是不确定性的，因而不会缓存，但包含 `ORDER BY` 的 `LIMIT` 是确定性的，所以会缓存。
+ 要将查询结果重用功能与 JDBC 结合使用，所需的最低驱动程序版本为 2.0.34.1000。对于 ODBC，所需的最低驱动程序版本为 1.1.19.1002。有关驱动程序下载信息，请参阅 [通过 ODBC 和 JDBC 驱动程序连接到 Amazon Athena](athena-bi-tools-jdbc-odbc.md)。
+ 对于使用多个数据目录的查询，不支持查询结果重用。
+  对于包含超过 20 个表的查询，不支持查询结果重用。
+ 对于小于 100 KB 的查询字符串，注释和空格之间的差异将被忽略，并且 `INNER JOIN` 和 `JOIN` 被视为等效项，以便重复使用结果。大于 100 KB 的查询字符串必须完全匹配才能重复使用结果。
+ 如果查询结果超出指定的最大期限，或未指定最大期限时超出 60 分钟的默认值，则查询结果被视为过期。可以指定重用查询结果的最大期限（以分钟、小时或天为单位）。无论使用何种时间单位，可指定的最大期限均为 7 天。
+ 不支持[托管查询结果](https://docs.amazonaws.cn/athena/latest/ug/managed-results.html)。

## 如何在 Athena 控制台中重复使用查询结果
<a name="reusing-query-results-athena-console"></a>

要使用该功能，请在 Athena 查询编辑器中启用 **Reuse query results**（重用查询结果）选项。

![\[在 Athena 查询编辑器中启用 Reuse query results（重用查询结果）。\]](http://docs.amazonaws.cn/athena/latest/ug/images/reusing-query-results-1.png)


**配置重用查询结果功能**

1. 在 Athena 查询编辑器中的 **Reuse query results**（重用查询结果）选项下，选择 **up to 60 minutes ago**（截至 60 分钟前）旁边的编辑图标。

1. 在 **Edit reuse time**（编辑重用时间）对话框中，从右侧的框中选择一个时间单位（分钟、小时或天）。

1. 在左侧的框中，输入或选择要指定的时间单位数。无论选择何种时间单位，可输入的最大时间均为七天。  
![\[配置重用查询结果的最大期限。\]](http://docs.amazonaws.cn/athena/latest/ug/images/reusing-query-results-2.png)

1. 选择**确认**。

   系统会显示一条横幅确认您的配置更改，同时 **Reuse query results**（重用查询结果）选项会显示新设置。