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

EXPLAIN

クエリを実行せずに、クエリステートメントの実行計画を表示します。

構文

Copy
EXPLAIN [ VERBOSE ] query

Parameters

VERBOSE

クエリプランの概要だけでなく、詳細情報を表示します。

query

説明を表示するクエリステートメント。SELECT、INSERT、CREATE TABLE AS、UPDATE、DELETE クエリステートメントを指定できます。

使用に関する注意事項

EXPLAIN のパフォーマンスは、一時テーブルの作成にかかる時間の影響を受けることがあります。例えば、共通のサブ式の最適化を使用するクエリでは、EXPLAIN の出力を返すために、一時テーブルを作成し、分析する必要があります。クエリプランは、一時テーブルのスキーマと統計情報に依存します。そのため、このようなクエリの EXPLAIN コマンドには、予測よりも長い実行時間がかかる可能性があります。

EXPLAIN は次のコマンドのみに使用できます。

  • SELECT

  • SELECT INTO

  • CREATE TABLE AS

  • INSERT

  • UPDATE

  • DELETE

データ定義言語 (DDL) やデータベース操作などのその他の SQL コマンドに対して使用した場合、EXPLAIN コマンドは失敗します。

クエリプランと実行ステップ

各 Amazon Redshift クエリステートメントの実行計画では、クエリの実行と計算を複数のステップとテーブル操作に分割し、クエリの最終的な結果セットを作成します。次の表では、ユーザーが実行のために送信するクエリの実行計画を作成するときに、Amazon Redshift で使用できるステップの概要を説明します。

EXPLAIN の演算子 クエリ実行手順 説明
SCAN:
Sequential Scan scan Amazon Redshift のリレーションスキャンまたはテーブルスキャンの演算子またはステップ。テーブル全体を最初から最後までスキャンします。また、WHERE 句で指定した場合は、各行についてのクエリの制約 (フィルタ) も評価します。また、INSERT、UPDATE、および DELETE ステートメントの実行にも使用されます。
JOINS:Amazon Redshift は、結合されるテーブルの物理的な設計、結合に必要なデータの場所、クエリ固有の属性に基づいて、異なる結合演算子を使用します。Subquery Scan -- Subquery scan と append は、UNION クエリの実行に使用されます。
Nested Loop nloop 最小限の最適な結合。主にクロス結合 (デカルト積、結合条件を使用しない) と一部の非等値結合に使用されます。
Hash Join hjoin 内部結合と左右の外部結合にも使用され、通常、入れ子のループ結合よりも高速です。Hash Join では、外部テーブルを読み取り、結合する列をハッシュ処理し、内部ハッシュテーブルで一致を検索します。ディスクを使用するステップにすることもできます (hjoin の内部入力は、ディスクベースにすることができるハッシュステップです)。
Merge Join mjoin 内部結合と外部結合にも使用されます (いずれの結合も、結合する列に基づいて分散とソートが行われます)。通常、他のコストを考慮しなければ、Amazon Redshift で最高速の結合アルゴリズムです。
AGGREGATION: 集計関数と GROUP BY 操作に関係するクエリに使用される演算子とステップ。
Aggregate aggr スカラー集計関数の演算子とステップ。
HashAggregate aggr グループ化された集計関数の演算子とステップ。ハッシュテーブルの効力をディスクに拡張して、ディスクから操作できます。
GroupAggregate aggr force_hash_grouping 設定の Amazon Redshift の構成設定がオフの場合に、グループ化された集計クエリに選択されることがある演算子。
SORT: クエリをソートする必要がある場合、または結果セットをマージする必要がある場合に使用される演算子とステップ。
並べ替え sort Sort は、ORDER BY 句で指定されたソートと、UNION や結合などの操作を実行します。ディスクから操作できます。
Merge merge 並行して実行された操作から派生した中間のソート結果に基づいて、クエリの最終的なソート結果を生成します。
EXCEPT、INTERSECT、UNION 操作:
SetOp Except [Distinct] hjoin EXCEPT クエリに使用されます。入力ハッシュをディスクベースにすることができる機能に基づいて、ディスクから操作できます。
Hash Intersect [Distinct] hjoin INTERSECT クエリに使用されます。入力ハッシュをディスクベースにすることができる機能に基づいて、ディスクから操作できます。
Append [All |Distinct] save Append は、UNION および UNION ALL クエリを実装するために、Subquery Scan と共に使用されます。「save」の機能に基づいて、ディスクから操作できます。
その他:
ハッシュ hash 内部結合と左右の外部結合に使用されます (ハッシュ結合に入力を提供します)。Hash 演算子で、結合の内部テーブルのハッシュテーブルが作成されます (内部テーブルは、一致について確認されるテーブルであり、2 つのテーブルの結合で、通常は 2 つのうち小さい方です)。
制限 limit LIMIT 句を評価します。
Materialize save 入れ子のループ結合と一部のマージ結合への入力のために、行をマテリアライズします。ディスクから操作できます。
-- parse ロード中にテキストの入力データを解析するために使用されます。
-- プロジェクト 列をソートし、式 (つまりプロジェクトデータ) を計算するために使用されます。
結果 -- テーブルへのアクセスを伴わないスカラー関数を実行します。
-- return 行をリーダーまたはクライアントに返します。
Subplan -- 特定のサブクエリに使用されます。
Unique unique SELECT DISTINCT および UNION クエリから重複が除外されます。
Window window 集計およびランキングウィンドウ関数を計算します。ディスクから操作できます。
ネットワーク操作:
Network (Broadcast) bcast Broadcast は、Join Explain 演算子とステップの属性でもあります。
Network (Distribute) dist データウェアハウスクラスターによる並行処理のために、行をコンピューティングノードに分散します。
Network (Send to Leader) return さらに詳細な処理のために、結果をリーダーに送り返します。
DML 操作 (データを変更する演算子) :
Insert (using Result) insert データを挿入します。
Delete (Scan + Filter) delete データを削除します。ディスクから操作できます。
Update (Scan + Filter) delete、insert delete と Insert として実装されます。

注記

これらの例では、出力例は Amazon Redshift 設定によって変わります。

次の例は、EVENT テーブルと VENUE テーブルから EVENTID、EVENTNAME、VENUEID、および VENUENAME を選択するクエリのクエリプランを返します。

Copy
explain select eventid, eventname, event.venueid, venuename from event, venue where event.venueid = venue.venueid;
Copy
QUERY PLAN -------------------------------------------------------------------------- XN Hash Join DS_DIST_OUTER (cost=2.52..58653620.93 rows=8712 width=43) Hash Cond: ("outer".venueid = "inner".venueid) -> XN Seq Scan on event (cost=0.00..87.98 rows=8798 width=23) -> XN Hash (cost=2.02..2.02 rows=202 width=22) -> XN Seq Scan on venue (cost=0.00..2.02 rows=202 width=22) (5 rows)

次の例では、同じクエリで詳細な出力のクエリプランを返します。

Copy
explain verbose select eventid, eventname, event.venueid, venuename from event, venue where event.venueid = venue.venueid;
Copy
QUERY PLAN -------------------------------------------------------------------------- {HASHJOIN :startup_cost 2.52 :total_cost 58653620.93 :plan_rows 8712 :plan_width 43 :best_pathkeys <> :dist_info DS_DIST_OUTER :dist_info.dist_keys ( TARGETENTRY { VAR :varno 2 :varattno 1 ... XN Hash Join DS_DIST_OUTER (cost=2.52..58653620.93 rows=8712 width=43) Hash Cond: ("outer".venueid = "inner".venueid) -> XN Seq Scan on event (cost=0.00..87.98 rows=8798 width=23) -> XN Hash (cost=2.02..2.02 rows=202 width=22) -> XN Seq Scan on venue (cost=0.00..2.02 rows=202 width=22) (519 rows)

次の例では、CREATE TABLE AS (CTAS) ステートメントのクエリプランを返します。

Copy
explain create table venue_nonulls as select * from venue where venueseats is not null; QUERY PLAN ----------------------------------------------------------- XN Seq Scan on venue (cost=0.00..2.02 rows=187 width=45) Filter: (venueseats IS NOT NULL) (2 rows)