Amazon Redshift Spectrum クエリパフォーマンス
このトピックでは、Redshift Spectrum クエリのパフォーマンスを向上させる方法について説明します。
クエリプランを参照し、Amazon Redshift Spectrum レイヤーにプッシュされているステップを確認します。
次のステップは、Redshift Spectrum クエリに関連しています。
-
S3 Seq Scan
-
S3 HashAggregate
-
S3 Query Scan
-
Seq Scan PartitionInfo
-
Partition Loop
次の例では、外部テーブルとローカルテーブルを結合するクエリのクエリプランを示します。Amazon S3 内のデータに対して実行された S3 Seq Scan および S3 HashAggregate の各ステップをメモします。
explain select top 10 spectrum.sales.eventid, sum(spectrum.sales.pricepaid) from spectrum.sales, event where spectrum.sales.eventid = event.eventid and spectrum.sales.pricepaid > 30 group by spectrum.sales.eventid order by 2 desc;
QUERY PLAN ----------------------------------------------------------------------------- XN Limit (cost=1001055770628.63..1001055770628.65 rows=10 width=31) -> XN Merge (cost=1001055770628.63..1001055770629.13 rows=200 width=31) Merge Key: sum(sales.derived_col2) -> XN Network (cost=1001055770628.63..1001055770629.13 rows=200 width=31) Send to leader -> XN Sort (cost=1001055770628.63..1001055770629.13 rows=200 width=31) Sort Key: sum(sales.derived_col2) -> XN HashAggregate (cost=1055770620.49..1055770620.99 rows=200 width=31) -> XN Hash Join DS_BCAST_INNER (cost=3119.97..1055769620.49 rows=200000 width=31) Hash Cond: ("outer".derived_col1 = "inner".eventid) -> XN S3 Query Scan sales (cost=3010.00..5010.50 rows=200000 width=31) -> S3 HashAggregate (cost=3010.00..3010.50 rows=200000 width=16) -> S3 Seq Scan spectrum.sales location:"s3://redshift-downloads/tickit/spectrum/sales" format:TEXT (cost=0.00..2150.00 rows=172000 width=16) Filter: (pricepaid > 30.00) -> XN Hash (cost=87.98..87.98 rows=8798 width=4) -> XN Seq Scan on event (cost=0.00..87.98 rows=8798 width=4)
クエリプラン内の次の要素をメモします。
-
S3 Seq Scan
ノードは、フィルタpricepaid > 30.00
が Redshift Spectrum レイヤーで処理されたことを示します。XN S3 Query Scan
ノードの下にあるフィルターノードは、データ上部の Amazon Redshift の述語処理が Redshift Spectrum レイヤーから返されたことを示します。 -
S3 HashAggregate
ノードは、Redshift Spectrum レイヤーで句 (group by spectrum.sales.eventid
) ごとにグループの集計が行われたことを示します。
Redshift Spectrum のパフォーマンスは次の方法で向上させることができます。
-
Apache Parquet 形式のデータファイルを使用します。Parquet は列形式でデータを保存するため、Redshift Spectrum は不要な列をスキャンから削除できます。データがテキストファイル形式である場合、Redshift Spectrum はファイル全体をスキャンする必要があります。
-
複数のファイルを使用して並列処理用に最適化します。ファイルサイズ を 64 MB 以上のまま維持します。ファイルをほぼ同じサイズにし、データサイズスキューを回避します。Apache Parquet ファイルと設定の推奨事項については、「Apache Parquet ドキュメント」の「File Format: Configurations
」を参照してください。 -
クエリで使用する列を可能な限り少なくします。
-
大きなファクトテーブルは Amazon S3 に置き、使用頻度の高い小さなディメンションテーブルはローカルの Amazon Redshift データベースに置きます。
-
TABLE PROPERTIES numRows パラメータを設定して、外部テーブル統計を更新します。CREATE EXTERNAL TABLE または ALTER TABLE に使用し、TABLE PROPERTIES numRows パラメータを設定して、テーブルの行数を反映できるようになりました。Amazon Redshift は、外部テーブルを分析して、クエリオプティマイザがクエリプランを生成するために使用するテーブル統計を生成することはありません。外部テーブルに対してテーブル統計が設定されていない場合、Amazon Redshift はクエリ実行プランを生成します。Amazon Redshift は、外部テーブルの方が大きくローカルテーブルの方が小さいという前提に基づいてこのプランを生成します。
-
Amazon Redshift クエリプランナーは、述語と集計を可能な限り Redshift Spectrum クエリレイヤーにプッシュします。Amazon S3 から大量のデータが返されると、クラスターのリソースによって処理が制限されます。Redshift Spectrum は自動的に拡張してサイズの大きいリクエストを処理します。このように、Redshift Spectrum レイヤーに処理をプッシュできる場合は常に全体的なパフォーマンスは向上します。
-
Redshift Spectrum レイヤーにプッシュできるフィルタリングと集計を使用するようにクエリを書き込みんでください。
以下に、Redshift Spectrum レイヤーにプッシュできるオペレーションの例を示します。
-
GROUP BY 句
-
比較条件とパターンマッチング条件 (LIKE など)
-
COUNT、SUM、AVG、MIN、MAX などの集計関数。
-
文字列関数。
Redshift Spectrum レイヤーにプッシュできないオペレーションには、DISTINCT や ORDER BY が含まれます。
-
-
パーティションを使用してスキャンされるデータを制限します。最も一般的な述語に基づいてデータをパーティション化し、パーティション列をフィルタリングしてパーティションを取り除きます。詳細については、「Redshift Spectrum 外部テーブルのパーティション化」を参照してください。
SVL_S3PARTITION にクエリを実行し、パーティションの総数と適格なパーティションの数を表示します。
-
AWS Glue の統計ジェネレータを使用して、AWS Glue Data Catalog テーブルの列レベルの統計を計算します。AWS Glue がデータカタログ内のテーブルの統計を生成すると、Amazon Redshift Spectrum はその統計を自動的に使用してクエリプランを最適化します。AWS Glue を使用して列レベルの統計を計算する方法の詳細については、「AWS Glue 開発者ガイド」の「列統計の処理」を参照してください「。