

 Amazon Redshift 將不再支援從修補程式 198 開始建立新的 Python UDFs。現有 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
```

## Parameters
<a name="r_EXPLAIN-parameters"></a>

詳細   
顯示完整查詢計畫，不只是摘要而已。

 *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

若您將 EXPLAIN 命令用於其他 SQL 命令，例如資料定義語言 (DDL) 或資料庫操作，則此命令將會失敗。

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>掃描 </td><td>Amazon Redshift 關聯式掃描或資料庫掃描運算子或步驟。從開頭到結尾循序掃描整個資料表；如 WHERE 子句中有指定，也會評估每個資料列的查詢限制條件 (篩選條件)。還會用來執行 INSERT、UPDATE 和 DELETE 陳述式。</td></tr>
  <tr><td colspan="3">JOINS：Amazon Redshift 會根據要聯結資料表的實體設計、聯結所需資料的位置，以及查詢本身的特定屬性來使用不同的聯結運算子。子查詢掃描 – 子查詢掃描和附加會用來執行 UNION 查詢。</td></tr>
  <tr><td>巢狀迴路 </td><td>nloop </td><td>最差聯結；主要用於交叉聯結 (笛卡兒乘積；無聯結條件) 和一些不相等聯結中。</td></tr>
  <tr><td>雜湊聯結 </td><td>hjoin </td><td>同樣用於內部聯結和左右外部聯結，且通常會較巢狀迴路聯結更快速。雜湊聯結會讀取外部資料表、雜湊聯結資料欄，並在內部雜湊表中尋找相符項目。步驟可溢寫至磁碟。(hjoin 的內部輸出可以是磁碟型的雜湊步驟。) </td></tr>
  <tr><td>合併聯結 </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>合併 </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 搭配 Subquery Scan 實作 UNION 和 UNION ALL 查詢。可根據 "save" 從磁碟操作。</td></tr>
  <tr><td colspan="3">其他：</td></tr>
  <tr><td>Hash </td><td>hash </td><td>用於內部聯結和左右外部聯結 (對雜湊聯結提供輸入)。Hash 運算子會為聯結的內部資料表建立雜湊資料表 (內部資料表是在兩個資料表的聯結中，要查看其中是否有相符項目的資料表，通常是兩個資料表中較小的)。</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>project </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>唯一 </td><td>unique </td><td>消除 SELECT DISTINCT 和 UNION 查詢中的重複項目。</td></tr>
  <tr><td>視窗 </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 也會在 STL\_EXPLAIN 系統資料表中記錄包含 RLS 述詞的完整查詢計畫。若在未授予此許可的情況下執行查詢，查詢將在沒有 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)
```