メニュー
Amazon Redshift
データベース開発者ガイド (API Version 2012年12月1日)

Amazon 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 をメモします。

Copy
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;
Copy
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://awssampledbuswest2/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 のパフォーマンスは次の方法で向上させることができます。

  • Parquet 形式のデータファイルを使用します。Parquet は列形式でデータを保存するため、Redshift Spectrum は不要な列をスキャンから削除できます。データがテキストファイル形式の場合、Redshift Spectrum はファイル全体をスキャンする必要があります。

  • クエリで使用する列を可能な限り少なくします。

  • 複数のファイルを使用して並列処理用に最適化します。ファイルサイズを 100 MB~1 GB にします。ファイルをほぼ同じサイズにし、データサイズスキューを回避します。

  • 大きなファクトテーブルは Amazon S3 に、使用頻度の高い小さなディメンションテーブルはローカルの Amazon Redshift データベースに置きます。

  • TABLE PROPERTIES numRows パラメータを設定して、外部テーブル統計を更新します。CREATE EXTERNAL TABLE または ALTER TABLE を使用して、TABLE PROPERTIES numRows パラメータをテーブルの行数を反映するように設定します。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 にクエリを実行し、パーティションの総数と適格なパーティションの数を表示します。