

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用成本型最佳化工具
<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 會使用這些統計資訊，儘早在查詢處理中套用限制最嚴格的篩選條件，以最佳化查詢。這項篩選會限制記憶體用量，以及為傳送查詢結果必須讀取的記錄數目。

當與 CBO 結合時，Athena 會使用稱為規則型最佳化工具 (RBO) 的功能。RBO 以機械方式套用預期可以改善查詢效能的規則。RBO 通常是有益的，因為它的轉換旨在簡化查詢計畫。但是，由於 RBO 不執行成本計算或計畫比較，因此更複雜的查詢會使 RBO 難以建立最佳計劃。

因此，Athena 同時使用 RBO 和 CBO 來最佳化您的查詢。Athena 在識別到改善查詢執行的機會之後，就會建立最佳計畫。如需有關執行計畫的詳細資訊，請參閱 [檢視 SQL 查詢的執行計畫](query-plans.md)。如需 CBO 運作方式的詳細討論，請參閱 AWS 巨量資料部落格中的[使用 Amazon Athena 中的成本型最佳化工具加速查詢](https://aws.amazon.com/blogs/big-data/speed-up-queries-with-cost-based-optimizer-in-amazon-athena/)。

若要產生 AWS Glue 目錄資料表的統計資料，您可以使用 Athena 主控台 AWS Glue 、主控台或 AWS Glue APIs。由於 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 開發人員指南*》中的[使用資料欄統計資料](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_tw/athena/latest/ug/images/cost-based-optimizer-1.png)

1. 在**產生統計資訊**對話方塊中，選擇**所有資料欄**以產生資料表中所有資料欄的統計資訊，或選擇**選取的資料欄**來選取特定的資料欄。預設值是**所有資料欄**。  
![\[「產生統計資訊」對話方塊。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/cost-based-optimizer-2.png)

1. 針對**AWS Glue 服務角色**，建立或選取現有的服務角色，以授予 產生統計資料 AWS Glue 的許可。 AWS Glue 服務角色還需要對包含資料表資料的 Amazon S3 儲存貯體的 [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_tw/athena/latest/ug/images/cost-based-optimizer-3.png)

1. 選擇**產生統計資料**。**正在產生 *table\$1name* 的統計資訊**通知橫幅會顯示任務狀態。  
![\[「正在產生統計資訊」通知橫幅。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/cost-based-optimizer-4.png)

1. 若要在 AWS Glue 主控台中檢視詳細資訊，請選擇在 **Glue 中檢視**。

   如需有關在 AWS Glue 主控台中檢視統計資料的資訊，請參閱[《 開發人員指南》中的檢視欄統計資料](https://docs.aws.amazon.com/glue/latest/dg/view-column-stats.html)。 *AWS Glue *

1. 產生統計資訊之後，具有統計資訊的資料表和資料欄會在括弧中顯示**統計資訊**一詞，如下圖所示。  
![\[Athena 查詢編輯器中顯示統計資訊圖示的資料表。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/cost-based-optimizer-5.png)

現在，當您執行查詢時，Athena 會針對產生統計資訊的資料表和資料欄，執行成本型最佳化。

## 啟用和停用資料表統計資訊
<a name="cost-based-optimizer-enabling-iceberg-table-statistics"></a>

當您依照上一節的步驟產生 Iceberg 資料表的資料表統計資料時，名為 的 Glue 資料表屬性`use_iceberg_statistics`會自動新增至 中的 Iceberg 資料表， AWS Glue Data Catalog 並預設為 **true**。如果您移除此屬性或將其設定為 **false**，則在查詢執行期間，CBO 不會在嘗試最佳化查詢計畫時使用 Iceberg 資料表統計資訊，即使該統計資訊是由 Glue 產生的。如需有關如何產生資料表統計資訊的詳細資訊，請參閱 [使用 Athena 主控台產生資料表統計資訊](#cost-based-optimizer-generating-table-statistics-using-the-athena-console)。

相反地，Glue Data Catalog 中的 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)
