Iceberg テーブルを最適化する - Amazon Athena

Iceberg テーブルを最適化する

Athena には、Apache Iceberg テーブルのクエリパフォーマンスを向上させるための最適化機能がいくつか用意されています。データが蓄積されると、ファイル処理のオーバーヘッドが増加し、Iceberg 削除ファイルに保存されている行レベルの削除を適用する際の計算コストが高くなるため、クエリの効率が低下する可能性があります。これらの課題に対応するため、Athena はテーブル構造を最適化するための手動の圧縮演算子と真空演算子をサポートしています。また、Athena は Iceberg 統計と連携すると、クエリ実行中の正確なデータプルーニングを目的としたコストベースのクエリ最適化と Parquet 列インデックス作成も実行できます。これらの機能は連携して、クエリの実行時間を短縮し、データスキャンを最小限に抑え、コストを削減します。このトピックでは、これらの最適化機能を使用して Iceberg テーブルで高性能クエリを維持する方法について説明します。

OPTIMIZE

OPTIMIZE table REWRITE DATA 圧縮アクションは、関連する削除ファイルのサイズと数に基づいて、データファイルをより最適化されたレイアウトに書き換えます。構文とテーブルプロパティの詳細については、「OPTIMIZE」を参照してください。

次の例では、削除ファイルをデータファイルにマージし、ターゲットファイルサイズに近いファイルを生成します。ここでは、category の値が c1 です。

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

VACUUM

VACUUMスナップショットの有効期限切れ孤立ファイルの削除を行います。これらのアクションにより、メタデータのサイズが小さくなり、現在のテーブル状態にないファイルのうち、テーブル用に指定された保持期間よりも古いファイルが削除されます。構文の詳細については、「VACUUM」を参照してください。

次の例では、テーブルプロパティを使用して過去 3 日間のデータを保持するようにテーブル iceberg_table を設定し、VACUUM を使用して古いスナップショットを期限切れにし、孤立ファイルをテーブルから削除します。

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

Iceberg テーブル統計を使用する

Athena のコストベースのオプティマイザは Iceberg 統計を使用して最適なクエリプランを作成します。Iceberg テーブルの統計が生成されると、Athena はこの情報を自動的に使用して、結合の順序、フィルター、集約動作に関するインテリジェントな決定を行い、それによって多くの場合、クエリのパフォーマンスを向上させ、コストを削減します。

S3 Tables を使用すると、Iceberg 統計はデフォルトで有効になります。他の Iceberg テーブルの場合、Athena はテーブルプロパティ use_iceberg_statistics を使用して、コストベースの最適化に統計を活用するかどうかを決定します。開始するには、「AWS Glue ユーザーガイド」の「列統計を使用したクエリパフォーマンスの最適化」を参照するか、Athena コンソールを使用して Iceberg テーブルでオンデマンド統計を生成します。

Parquet 列インデックス作成を使用する

Parquet 列インデックス作成を使用すると、Athena は行グループレベルの統計に加えてページレベルの最小/最大統計を活用することで、クエリの実行中により正確なデータプルーニングを実行できます。これにより、Athena は行グループ内の不要なページをスキップできるようになり、スキャンされるデータ量が大幅に削減され、クエリのパフォーマンスが向上します。ソートされた列に選択的フィルター述語があるクエリに最適です。Athena が Amazon S3 から読み取る必要があるデータの量を減らすと同時に、実行時間とデータスキャン効率の両方を向上させます。

基盤となる Parquet ファイルに列インデックスが存在する場合、Athena はデフォルトで S3 Tables とともに Parquet 列インデックスを使用します。他の Iceberg テーブルの場合、Athena は use_iceberg_parquet_column_index プロパティを使用して、Parquet ファイル内の列インデックスを使用するかどうかを決定します。AWS Glue コンソールまたは UpdateTable API を使用して、このテーブルプロパティを設定します。