EXPLAIN - Amazon Redshift

EXPLAIN

クエリを実行せずに、クエリステートメントの実行計画を表示します。クエリ分析ワークフローの詳細については、「クエリ分析ワークフロー」を参照してください。

構文

EXPLAIN [ VERBOSE ] query

パラメータ

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 は EXPLAIN 出力の相対単位コストを使用してクエリプランを選択します。Amazon Redshift は、さまざまなリソース見積もりのサイズを比較してプランを決定します。

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

各 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 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 として実装されます。

RLS に EXPLAIN を使う

クエリに行レベルセキュリティ (RLS) ポリシーの対象となるテーブルが含まれている場合、EXPLAIN は特別な RLS SecureScan ノードを表示します。Amazon Redshift は、同じノードタイプを STL_EXPLAIN システムテーブルにも記録します。EXPLAIN は、dim_tbl に適用される RLS 述語を明らかにしません。RLS SecureScan ノードタイプは、現在のユーザーには見えない追加の操作が実行プランに含まれていることを示す指標として機能します。

次の例は、RLS SecureScan ノードを示しています。

EXPLAIN SELECT D.cint FROM fact_tbl F INNER JOIN dim_tbl D ON F.k_dim = D.k WHERE F.k_dim / 10 > 0; QUERY PLAN ------------------------------------------------------------------------ XN Hash Join DS_DIST_ALL_NONE (cost=0.08..0.25 rows=1 width=4) Hash Cond: ("outer".k_dim = "inner"."k") -> *XN* *RLS SecureScan f (cost=0.00..0.14 rows=2 width=4)* Filter: ((k_dim / 10) > 0) -> XN Hash (cost=0.07..0.07 rows=2 width=8) -> XN Seq Scan on dim_tbl d (cost=0.00..0.07 rows=2 width=8) Filter: (("k" / 10) > 0)

RLS の対象となるクエリプランの完全な調査を可能にするため、Amazon Redshift は EXPLAIN RLS のシステム許可を提供します。この許可を付与されたユーザーは、RLS 述語も含む完全なクエリプランを検査できます。

次の例は、RLS SecureScan ノードの下に追加の Seq Scan にも RLS ポリシー述語 (k_dim > 1) が含まれることを示しています。

EXPLAIN SELECT D.cint FROM fact_tbl F INNER JOIN dim_tbl D ON F.k_dim = D.k WHERE F.k_dim / 10 > 0; QUERY PLAN --------------------------------------------------------------------------------- XN Hash Join DS_DIST_ALL_NONE (cost=0.08..0.25 rows=1 width=4) Hash Cond: ("outer".k_dim = "inner"."k") *-> XN RLS SecureScan f (cost=0.00..0.14 rows=2 width=4) Filter: ((k_dim / 10) > 0)* -> *XN* *Seq Scan on fact_tbl rls_table (cost=0.00..0.06 rows=5 width=8) Filter: (k_dim > 1)* -> XN Hash (cost=0.07..0.07 rows=2 width=8) -> XN Seq Scan on dim_tbl d (cost=0.00..0.07 rows=2 width=8) Filter: (("k" / 10) > 0)

EXPLAIN RLS 許可がユーザーに付与されている間、Amazon Redshift は RLS 述語を含む完全なクエリプランを STL_EXPLAIN システムテーブルに記録します。この許可が付与されていない間に実行されるクエリは、RLS 内部情報なしでログ記録されます。EXPLAIN RLS 許可を付与または削除しても、Amazon Redshift が以前のクエリで STL_EXPLAIN にログ記録した内容は変更されません。

AWS Lake Formation-RLS による Redshift の保護関係

次の例は、LF SecureScan ノードを示しています。このノードを使用して、Lake Formation と RLS の関係を表示できます。

EXPLAIN SELECT * FROM lf_db.public.t_share WHERE a > 1; QUERY PLAN --------------------------------------------------------------- XN LF SecureScan t_share (cost=0.00..0.02 rows=2 width=11) (2 rows)

注記

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

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

explain select eventid, eventname, event.venueid, venuename from event, venue where event.venueid = venue.venueid;
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)

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

explain verbose select eventid, eventname, event.venueid, venuename from event, venue where event.venueid = venue.venueid;
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) ステートメントのクエリプランを返します。

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)