

# コストベースオプティマイザーを使用する
<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 などのファイルタイプの、null 値、最大値、最小値といった個別の値の個数などの列レベル統計です。Amazon Athena は、クエリ処理のできるだけ早い段階で最も制限の厳しいフィルタを適用することにより、これらの統計を使用してクエリを最適化します。このフィルタリングにより、メモリ使用量、ならびにクエリ結果を配信するために読み取る必要のあるレコード数が制限されます。

CBO と併せて、Athena はルールベースオプティマイザー (RBO) と呼ばれる機能を使用します。RBO は、クエリのパフォーマンス向上が期待されるルールを自動的に適用します。RBO の変換はクエリプランの簡略化を目的としているため、一般的にメリットがあります。ただし、RBO はコスト計算やプラン比較を行わないため、クエリが複雑になると RBO が最適なプランを作成することが難しくなります。

このため、Athena は RBO および CBO の両方を使用してクエリを最適化します。Athena はクエリ実行を改善する機会を特定した後、最適なプランを作成します。実行プラン内容の詳細については、「[SQL クエリの実行プランを表示する](query-plans.md)」を参照してください。CBO の仕組みについての詳しい内容については、AWS Big Data Blog 記事「[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 デベロッパーガイド」の「[列統計の使用](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 クエリエディタの **[テーブル]** リストで、目的のテーブルにある縦 3 つの点を選択し、**[統計の生成]** を選択します。  
![\[Athena クエリエディタのテーブルのコンテキストメニュー。\]](http://docs.aws.amazon.com/ja_jp/athena/latest/ug/images/cost-based-optimizer-1.png)

1. **[統計の生成]** ダイアログボックスで、**[すべての列]** を選択してテーブルにあるすべての列の統計を生成するか、**[選択した列]** を選択して特定の列を選択します。**[全ての列]** がデフォルト設定です。  
![\[[統計の生成] ダイアログボックス。\]](http://docs.aws.amazon.com/ja_jp/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/ja_jp/athena/latest/ug/images/cost-based-optimizer-3.png)

1. **[統計の生成]** を選択します。**[*table\$1name* の統計を生成中]** 通知バナーがタスクステータスを表示します。  
![\[[統計生成中] 通知バナー。\]](http://docs.aws.amazon.com/ja_jp/athena/latest/ug/images/cost-based-optimizer-4.png)

1. AWS Glue コンソールに詳細を表示するには、**[Glue で表示]** を選択します。

   AWS Glue コンソールで統計の表示に関する詳細については、「AWS Glue デベロッパーガイド」の「[列の統計の表示](https://docs.aws.amazon.com/glue/latest/dg/view-column-stats.html)」を参照してください。

1. 統計が生成された後、次の画像のように、統計を含むテーブルと列には括弧内に **[統計]** という単語が表示されます。  
![\[Athena クエリエディタに表示される統計アイコンを示すテーブル。\]](http://docs.aws.amazon.com/ja_jp/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` が AWS Glue Data Catalog の Iceberg テーブルに自動的に追加され、デフォルトで **[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)
