メニュー
Amazon Redshift
データベース開発者ガイド (API Version 2012-12-01)

クエリプランの評価

クエリプランを使用すると、分散スタイル最適化の候補を特定できます。

初期設計の決定を行った後で、テーブルを作成し、テーブルにデータをロードして、テーブルをテストします。実際のデータにできるだけ近いテストデータセットを使用します。比較のベースラインとして使用するロード時間を測定します。

実行する予定のクエリのうち、典型的な高コストクエリ、つまり結合と集計を使用するクエリを評価します。さまざまな設計オプションの実行時間を比較します。実行時間を比較する際は、最初の実行時間にはコンパイル時間が含まれるため、初回のクエリ実行はカウントしないでください。

DS_DIST_NONE

対応するスライスはコンピューティングノードにコロケーションされているため、再分散は必要となりません。通常は、DS_DIST_NONE ステップ (ファクトテーブルと単一のディメンションテーブル間の結合) が 1 つあるだけです。

DS_DIST_ALL_NONE

内部結合テーブルで DISTSTYLE ALL が使用されているため、再分散は必要となりません。テーブル全体が各ノードに配置されます。

DS_DIST_INNER

内部テーブルが再分散されます。

DS_DIST_OUTER

外部テーブルが再分散されます。

DS_BCAST_INNER

内部テーブル全体のコピーがすべてのコンピューティングノードにブロードキャストされます。

DS_DIST_ALL_INNER

外部テーブルで DISTSTYLE ALL が使用されるため、内部テーブル全体が単一スライスに再分散されます。

DS_DIST_BOTH

両方のテーブルが再分散されます。

DS_DIST_NONE と DS_DIST_ALL_NONE が好適です。この 2 つは、すべての結合がコロケーションされているため、そのステップで分散が必要とならなかったことを示します。

DS_DIST_INNER は、内部テーブルがノードに再分散されているため、ステップのコストが比較的高くなる可能性があることを意味します。DS_DIST_INNER は、外部テーブルが結合キーを使用してすでに正しく分散されていることを示します。これを DS_DIST_NONE に変換するには、内部テーブルの分散キーを結合キーに設定します。外部テーブルが結合キーを使用して分散されていないため、結合キーを使用して内部テーブルを分散できない場合は、内部テーブルに対して ALL 分散を使用すべきかどうかを評価します。テーブルの移動が比較的少ない場合、つまり、テーブルの更新頻度が低いか、更新範囲が広くない場合で、高い再分散コストに対応できるだけの十分なテーブルサイズの場合は、分散スタイルを ALL に変更してから、再びテストします。ALL 分散はロード時間の長期化を招くため、再テストする場合は、評価要因にロード時間を含めてください。

DS_DIST_ALL_INNER は好適ではありません。これは、外部テーブルで DISTSTYLE ALL が使用されているため、外部テーブル全体のコピーが各ノードに配置されるよう、内部テーブル全体が単一スライスに再分散されることを意味します。その結果、全ノードを使用した並列実行のメリットを生かせず、単一ノードで結合が直列実行されるという非効率が生じます。DISTSTYLE ALL は、内部結合テーブルでのみ使用するよう設計されています。代わりに、外部テーブルの分散キーを指定するか、EVEN 分散を使用してください。

DS_BCAST_INNER と DS_DIST_BOTH は好適ではありません。通常、これらの再分散は、再分散キーを使用してテーブルが結合されないために行われます。ファクトテーブルにまだ分散キーが指定されていない場合は、両方のテーブルの分散キーとして結合列を指定します。ファクトテーブルの別の列に分散キーがすでに指定されている場合は、この結合をコロケーションするために分散キーを変更することが全般的なパフォーマンスの向上につながるかどうかを評価する必要があります。外部テーブルの分散キーを変更することが最適な選択肢でない場合は、内部テーブルに DISTSTYLE ALL を指定することによってコロケーションを実現できます。

次の例は、DS_BCAST_INNER ラベルと DS_DIST_NONE ラベルを持つクエリプランの一部を示しています。

Copy
-> XN Hash Join DS_BCAST_INNER (cost=112.50..3272334142.59 rows=170771 width=84) Hash Cond: ("outer".venueid = "inner".venueid) -> XN Hash Join DS_BCAST_INNER (cost=109.98..3167290276.71 rows=172456 width=47) Hash Cond: ("outer".eventid = "inner".eventid) -> XN Merge Join DS_DIST_NONE (cost=0.00..6286.47 rows=172456 width=30) Merge Cond: ("outer".listid = "inner".listid) -> XN Seq Scan on listing (cost=0.00..1924.97 rows=192497 width=14) -> XN Seq Scan on sales (cost=0.00..1724.56 rows=172456 width=24)

DISTSTYLE ALL を使用するようディメンションテーブルに変更を加えると、同じクエリのクエリプランに DS_BCAST_INNER ではなく DS_DIST_ALL_NONE が表示されるようになります。また、結合ステップの相対的なコストも大幅に変化します。

Copy
-> XN Hash Join DS_DIST_ALL_NONE (cost=112.50..14142.59 rows=170771 width=84) Hash Cond: ("outer".venueid = "inner".venueid) -> XN Hash Join DS_DIST_ALL_NONE (cost=109.98..10276.71 rows=172456 width=47) Hash Cond: ("outer".eventid = "inner".eventid) -> XN Merge Join DS_DIST_NONE (cost=0.00..6286.47 rows=172456 width=30) Merge Cond: ("outer".listid = "inner".listid) -> XN Seq Scan on listing (cost=0.00..1924.97 rows=192497 width=14) -> XN Seq Scan on sales (cost=0.00..1724.56 rows=172456 width=24)