翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Amazon Redshift の SQL クエリ処理
Amazon Redshift は、パーサーおよびオプティマイザを通じて送信された SQL クエリをルーティングし、クエリプランを作成します。その後、実行エンジンは、クエリプランをコードに変換し、そのコードを実行するためにコンピューティングノードに送信します。クエリプランを設計する前に、クエリ処理の仕組みを理解することが重要です。
クエリプランと実行ワークフロー
次の図は、クエリのプランニングと実行のワークフローの概要です。
この図表は、次のワークフローを示しています:
-
Amazon Redshift クラスターのリーダーノードでクエリを受け取り、SQL ステートメントを解析します。
-
パーサーは、元のクエリの論理的な表現である初期クエリツリーを生成します。
-
クエリオプティマイザは、初期クエリツリーを取得して評価し、テーブル統計を分析して結合順序と述語の選択性を決定します。また、必要に応じてクエリを書き換え、効率を最大化します。1 つのクエリをバックグラウンドで複数の従属ステートメントとして記述できる場合があります。
-
オプティマイザは、最高のパフォーマンスで実行されるように 1 つのクエリプラン (または、前のステップで複数のクエリが生成された場合は複数のクエリプラン) を生成します。クエリプランで、実行順序、ネットワークオペレーション、結合タイプ、結合の順序、集計オプション、データ分散などの実行オプションを指定します。
-
クエリプランには、クエリを実行するために必要な個々のオペレーションに関する情報が含まれます。クエリプランを表示するには、
EXPLAINコマンドを使用できます。クエリプランは、複雑なクエリを分析およびチューニングするための基本ツールです。 -
クエリオプティマイザは、クエリプランを実行エンジンに送信します。実行エンジンは、コンパイルされたプランキャッシュでクエリプランの一致をチェックし、コンパイルされたキャッシュ (見つかった場合) を使用します。見つからない場合、実行エンジンによってクエリプランをステップ、セグメント、ストリームに変換します。
-
ステップは、クエリの実行中に発生する個々のオペレーションです。ステップはラベル (
scan、dist、hjoin、mergeなど) で識別されます。ステップは最小の単位です。コンピューティングノードでクエリ、結合、または他のデータベース操作を実行できるように、ステップを組み合わせることができます。 -
セグメントは、クエリのセグメントを参照し、1 つのプロセスで実行できる複数のステップを組み合わせます。セグメントは、コンピューティングノードのスライスによって実行可能な最小コンパイルユニットです。スライスは、Amazon Redshift の並列処理単位です。
-
ストリームは、使用できるコンピューティングノードスライスに並列化するセグメントのコレクションです。ストリームのセグメントは、ノードスライスに並行して実行されます。したがって、同じセグメントの同じステップも複数のスライスで並行して実行されます。
-
-
コードジェネレーターは変換されたプランを受け取り、セグメントごとに C++ 関数を生成します。
-
生成された C++ 関数は GNU コンパイラコレクションによってコンパイルされ、O (
.o) ファイルに変換されます。 -
コンパイルされたコード (O ファイル) が実行されます。コンパイルされたコードの実行は解釈されたコードよりも速く、使用するコンピューティングキャパシティも少なくなります。
-
その後、コンパイルされた O ファイルは、コンピューティングノードにブロードキャストされます。
-
各コンピューティングノードは、複数のコンピューティングスライスで構成されます。コンピューティングスライスは、クエリセグメントを並列的に実行します。Amazon Redshift は、最適化されたネットワーク通信、メモリ、ディスク管理を利用して、クエリプランのステップから次のステップに中間結果を渡します。これは、クエリ実行の高速化にも役立ちます。以下の点を考慮してください。
-
ステップ 6、7、8、9、10、11 はストリームごとに 1 回実行されます。
-
エンジンは、1 つのストリームに対して実行可能なセグメントを作成し、コンピューティングノードに送信します。
-
前のストリームのセグメントが完了したら、エンジンが次のストリームのセグメントを生成します。これにより、エンジンは前のストリームで何が発生したかを分析し (操作がディスクベースであったかどうかなど)、次のストリーム内におけるセグメントの生成に影響を与えることができます。
-
-
コンピューティングノードが完了したら、最終処理を行うためクエリの結果をリーダーノードに返します。リーダーノードは、データを 1 つの結果セットにマージし、必要なソートまたは集計すべてに対処します。
-
リーダーノードは結果をクライアントに返します。
次の図は、ストリーム、セグメント、ステップ、コンピューティングノードスライスの実行ワークフローを示しています。以下に留意してください。
-
セグメント内のステップは順番に実行されます。
-
ストリーム内のセグメントは並行して実行されます。
-
ストリームは順番に実行されます。
-
コンピューティングノードスライスは並行して実行されます。
次の図は、ストリーム、セグメント、ステップの視覚的表現を示しています。各セグメントには複数のステップが含まれ、各ストリームには複数のセグメントが含まれます。
次の図は、クエリ実行とコンピューティングノードスライスの視覚的表現を示しています。各コンピューティングノードには、複数のスライス、ストリーム、セグメント、ステップが含まれます。
その他の考慮事項
クエリ処理については、次の点を考慮することをお勧めします。
-
キャッシュされたコンパイル済みのコードは、同じクラスターのセッション間で共有されるので、多くの場合、同じクエリの 2 回目以降の実行は、パラメータが異なっていたとしても速くなります。
-
クエリのベンチマークを行うときは、常にクエリの 2 回目の実行時間を比較することをお勧めします。1 回目の実行時間には、コードをコンパイルするオーバーヘッドが含まれるためです。詳細については、「Amazon Redshift のクエリのベストプラクティス」ガイドの「クエリのパフォーマンス要因」を参照してください。
-
コンピューティングノードは、必要に応じてクエリの実行中に一部のデータをリーダーノードに返すことがあります。例えば、
LIMIT句を含むサブクエリがある場合、詳細な処理を行うためデータがクラスターに再分散される前に制限がリーダーノードに適用されます。