Amazon Redshift Spectrum を使用する際のベストプラクティス
このセクションでは、Amazon Redshift Spectrum を使用するためのベストプラクティスの概要について説明します。Redshift Spectrum を使用する際に最適なパフォーマンスを実現するには、以下のベストプラクティスに従うことをお勧めします。
-
ファイルタイプが Redshift Spectrum クエリのパフォーマンスに重大な影響を与えることを考慮してください。パフォーマンスを向上させるには、ORC や Parquet などの列エンコードされたファイルを使用し、CSV 形式はごく小さなディメンションテーブルにのみ使用します。
-
プレフィックスベースのパーティショニングを使用して、パーティションプルーニングを活用します。つまり、データレイク内のパーティションにキー指定されたフィルターを使用します。
-
Redshift Spectrum は大規模なリクエストを処理するために自動的にスケールされるため、Redshift Spectrum ではできるだけ多くの処理を行います (述語のプッシュダウンなど)。
-
頻繁にフィルタリングされる列のパーティションファイルには注意してください。データが 1 つ以上のフィルタリングされた列によってパーティション分割されている場合、Redshift Spectrum はパーティションプルーニングを活用し、不要なパーティションやファイルのスキャンをスキップできます。一般的な方法では、時間に基づいてデータをパーティション化します。
-
次のクエリを使用して、パーティションの有効性と Redshift Spectrum クエリの効率性を確認できます。
Select query, segment, max(assigned_partitions) as total_partitions, max(qualified_partitions) as qualified_partitions From svl_s3partition Where query=pg_last_query_id() Group by 1,2;前述のクエリは以下を示しています。
-
total_partitions – AWS Glue Data Catalog によって認識されるパーティションの数
-
qualified_partitions – Redshift Spectrum クエリでアクセスされる Amazon Simple Storage Service (Amazon S3) のプレフィックスの数
-
-
また、
SVL_S3QUERY_SUMMARYシステムテーブルをチェックして、パーティションの有効性と Redshift Spectrum クエリの効率性を確認することもできます。これを行うには、以下のステートメントを実行します。Select * From svl_s3query_summary Where query=pg_last_query_id();前述のクエリは、パーティションプルーニングの効率性を示すファイルに加えて、
is_partitioned、s3_scanned_rows/bytes、およびs3_returned_rows/bytesの値を含むさらに多くの情報を返します。
Redshift Spectrum での述語プッシュダウン
述語プッシュダウンを使用すると、Amazon Redshift クラスターでのリソースの消費を回避できます。多くの SQL オペレーションを Redshift Spectrum レイヤーにプッシュダウンできます。これを可能な限り活用することをお勧めします。
以下に留意してください。
-
Redshift Spectrum レイヤー内では、次のようないくつかのタイプの SQL オペレーションを完全に評価できます。
-
GROUP BY句 -
比較条件とパターンマッチング条件 (例:
LIKE) -
集計関数 (例:
COUNT、SUM、AVG、MIN、MAX) -
regex_replace、to_upper、date_trunc、およびその他の関数
-
-
DISTINCTやORDER BYを含む一部のオペレーションを Redshift Spectrum レイヤーにプッシュすることはできません。ソートはリーダーノードで実行されるため、可能であればクエリの最上位レベルでのみORDER BYを実行してください。 -
EXPLAINクエリプランを調べて、述語プッシュダウンが有効かどうかを確認します。EXPLAINコマンドで Redshift Spectrum 部分を検索するには、以下のステップを参照してください。-
S3 Seq Scan
-
S3 HashAggregate
-
S3 Query Scan
-
Seq Scan PartitionInfo
-
Partition Loop
-
-
クエリで使用する列数を最小限にします。Redshift Spectrum では、データが Parquet 形式または ORC 形式の場合、スキャンする列を減らすことができます。
-
並列処理とパーティション排除のためにパーティションをフル活用し、可能であればファイルサイズを 64 MB 以上に維持します。
-
CREATE EXTERNAL TABLEまたはALTER TABLEを使用する場合は、TABLE PROPERTIES'numRows'='nnn'を設定します。Amazon Redshift は、外部テーブルを分析して、クエリオプティマイザがクエリプランを生成するために使用するテーブル統計を生成することはありません。統計情報が設定されていない場合、Amazon Redshift は、外部テーブルの方が大きくローカルテーブルの方が小さいということを前提にします。
Redshift Spectrum のクエリ調整のヒント
クエリを調整するときは、次の点に注意することをお勧めします。
-
Amazon Redshift クラスターがクエリにエンゲージできる Redshift Spectrum ノードの数は、クラスター内のスライスの数に関連付けられます。
-
クラスターのサイズを変更すると、クラスターのローカルコンピューティングプロファイル、ストレージプロファイル、Amazon S3 データレイククエリのクエリ機能にメリットがあります。
-
Amazon Redshift クエリプランナーは、述語と集計を可能な限り Redshift Spectrum クエリレイヤーにプッシュします。
-
Amazon S3 から大量のデータが返されると、クラスターのリソースによって処理が制限されます。
-
Redshift Spectrum は大規模なリクエストを処理するように自動的にスケールするため、Redshift Spectrum レイヤーに処理をプッシュできるたびに全体的なパフォーマンスが向上します。