

 Amazon Redshift は、パッチ 198 以降、新しい Python UDF の作成をサポートしなくなります。既存の Python UDF は、2026 年 6 月 30 日まで引き続き機能します。詳細については、[ブログ記事](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)を参照してください。

# EXPLAIN
<a name="r_EXPLAIN"></a>

クエリを実行せずに、クエリステートメントの実行計画を表示します。クエリ分析ワークフローの詳細については、「[クエリ分析ワークフロー](c-query-analysis-process.md)」を参照してください。

## 構文
<a name="r_EXPLAIN-synopsis"></a>

```
EXPLAIN [ VERBOSE ] query
```

## パラメータ
<a name="r_EXPLAIN-parameters"></a>

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

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

## 使用に関する注意事項
<a name="r_EXPLAIN-usage-notes"></a>

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

EXPLAIN は次のコマンドのみに使用できます。
+ SELECT
+ SELECT INTO
+ CREATE TABLE AS
+ INSERT
+ UPDATE
+ DELETE

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

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

## クエリプランと実行ステップ
<a name="r_EXPLAIN-query-planning-and-execution-steps"></a>

各 Amazon Redshift クエリステートメントの実行計画では、クエリの実行と計算を複数のステップとテーブル操作に分割し、クエリの最終的な結果セットを作成します。クエリの計画については、「[クエリ処理](c-query-processing.md)」を参照してください。

次の表では、ユーザーが実行のために送信するクエリの実行計画を作成するときに、Amazon Redshift で使用できるステップの概要を説明します。


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


## RLS に EXPLAIN を使う
<a name="r_EXPLAIN-RLS"></a>

クエリに行レベルセキュリティ (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 の保護関係
<a name="r_EXPLAIN_RLS-LF"></a>

次の例は、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)
```

## 例
<a name="r_EXPLAIN-examples"></a>

**注記**  
これらの例では、出力例は 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)
```