「翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。」
Amazon Redshift Spectrum クエリパフォーマンスの向上
クエリプランを参照し、Amazon Redshift Spectrum レイヤーにプッシュされているステップを確認します。
次のステップは、Redshift Spectrum クエリに関連しています。
-
S3 Seq Scan
-
S3 HashAggregate
-
S3 Query Scan
-
Seq スキャンPartitionInfo
-
Partition Loop
次の例では、外部テーブルとローカルテーブルを結合するクエリのクエリプランを示します。のデータに対して実行された S3 Seq Scan および S3 HashAggregate ステップAmazon S3に注意してください。
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://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 のパフォーマンスは次の方法で向上させることができます。
-
Apache Parquet 形式のデータファイルを使用します。Parquet は列形式でデータを保存するため、Redshift Spectrum は不要な列をスキャンから削除できます。データがテキストファイル形式である場合、Redshift Spectrum はファイル全体をスキャンする必要があります。
-
クエリで使用する列を可能な限り少なくします。
-
複数のファイルを使用して並列処理用に最適化します。ファイルサイズ を 64 MB 以上のまま維持します。ファイルをほぼ同じサイズにし、データサイズスキューを回避します。
-
大きなファクトテーブルは Amazon S3 に置き、使用頻度の高い小さなディメンションテーブルはローカルの Amazon Redshift データベースに置きます。
-
TABLE PROPERTIES numRows パラメータを設定して、外部テーブル統計を更新します。テーブル内の行数を反映するために TABLE PROPERTIES CREATE EXTERNAL TABLE パラメータを ALTER TABLE または に設定します。 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 にクエリを実行し、パーティションの総数と適格なパーティションの数を表示します。