

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Amazon Redshift 中的查詢計畫
<a name="query-plan"></a>

*查詢計畫*是執行引擎在對資料執行查詢時必須遵循的指示清單。您可以執行 [EXPLAIN](https://docs.aws.amazon.com/redshift/latest/dg/r_EXPLAIN.html) 命令，後面接著實際的查詢文字來建立查詢計劃，如下列範例查詢所示：

```
EXPLAIN
select s.s_name, sum(li.l_quantity) as quantity
from tpch.lineitem li
join tpch.orders o
    on o.o_orderkey = li.l_orderkey
    and o.o_orderdate > '1992-05-01'
join tpch.supplier s
    on s.s_suppkey = li.l_suppkey
group by s.s_name
order by quantity desc
limit 10;
```

如果您針對上述查詢範例執行 `EXPLAIN`命令，您會收到下列輸出：

```
XN Limit (cost=1004400430902.15..1004400430902.17 rows=10 width=39)
  -> XN Merge (cost=1004400430902.15..1004400430926.97 rows=9928 width=39)
        Merge Key: sum(li.l_quantity)
        -> XN Network (cost=1004400430902.15..1004400430926.97 rows=9928 width=39)
              Send to leader
                  -> XN Sort (cost=1004400430902.15..1004400430926.97 rows=9928 width=39)
                     Sort Key: sum(li.l_quantity)
                      -> XN HashAggregate (cost=4400430218.24..4400430243.06 rows=9928 width=39)
                           -> XN Hash Join DS_BCAST_INNER (cost=21489.58..4400401726.35 rows=5698378 width=39)
                                 Hash Cond: ("outer".l_suppkey = "inner".s_suppkey)
                                     -> XN Hash Join DS_DIST_NONE (cost=21364.58..273387.85 rows=5698378 width=14)
                                            Hash Cond: ("outer".l_orderkey = "inner".o_orderkey)
                                                   -> XN Seq Scan on lineitem li (cost=0.00..60012.15 rows=6001215 width=22)
                                                   -> XN Hash (cost=17803.81..17803.81 rows=1424306 width=8)
                                                           -> XN Seq Scan on orders o (cost=0.00..17803.81 rows=1424306 width=8)
                                                                    Filter: (o_orderdate > '1992-05-01'::date)
                                     -> XN Hash (cost=100.00..100.00 rows=10000 width=33)
                                             -> XN Seq Scan on supplier s (cost=0.00..100.00 rows=10000 width=33)
```

**注意**  
查詢計畫輸出範例是查詢執行的簡化、高階檢視。範例計劃不會說明平行查詢處理的詳細資訊。如需詳細資訊，請執行查詢，然後使用 [SVL\_QUERY\_SUMMARY](https://docs.aws.amazon.com/redshift/latest/dg/r_SVL_QUERY_SUMMARY.html) 或 [SVL\_QUERY\_REPORT](https://docs.aws.amazon.com/redshift/latest/dg/r_SVL_QUERY_REPORT.html) 檢視來取得查詢摘要資訊。

## Amazon Redshift 查詢編輯器第 2 版
<a name="query-editor-v2"></a>

您也可以使用查詢編輯器 v2 中的**說明**選項，在 Amazon Redshift 中檢視查詢計劃。如需說明，請參閱《Amazon Redshift 文件》中的[使用查詢編輯器 v2](https://docs.aws.amazon.com/redshift/latest/mgmt/query-editor-v2-using.html)。

查詢編輯器 v2 產生的查詢計畫包含下列資訊：
+ 執行引擎執行的操作，從下到上讀取結果
+ 每個操作執行的步驟類型
+ 每個操作會使用哪些資料表和資料欄
+ 每個操作中處理的資料量，以位元組為單位的資料列數和資料寬度表示
+ 操作的相對成本 （成本是比較計畫中步驟相對執行時間的指標。 成本不會提供有關實際執行時間或記憶體耗用量的精確資訊，也不會在執行計畫之間提供有意義的比較。 不過，成本確實可讓您指出查詢中哪些操作耗用最多資源。)

## EXPLAIN 計劃
<a name="explain-plans"></a>

您可以使用 [STL\_EXPLAIN](https://docs.aws.amazon.com/redshift/latest/dg/r_STL_EXPLAIN.html) 系統資料表來顯示已提交執行之查詢的`EXPLAIN`計劃。整體而言，使用 `STL_EXPLAIN` 有助於改善 Amazon Redshift 查詢的效能、效率和成本效益。

使用 的優點`STL_EXPLAIN`如下：
+ **效能最佳化** – `STL_EXPLAIN` 可協助識別可最佳化的查詢區域，以獲得更好的效能。
+ **查詢規劃** – `STL_EXPLAIN` 可以提供有關 Amazon Redshift 如何執行查詢的資訊，並可協助識別查詢中的潛在瓶頸。
+ **偵錯 **– 透過顯示 Amazon Redshift 執行該查詢所採取的步驟，`STL_EXPLAIN`協助診斷查詢的問題。
+ **了解 Amazon Redshift 行為** – `STL_EXPLAIN` 可以提供 Amazon Redshift 如何處理查詢的洞見。這有助於提升您對 Amazon Redshift 行為的了解。
+ **成本最佳化** – `STL_EXPLAIN` 可提供有關查詢預估成本的資訊。這可協助您識別可最佳化成本的領域。

下列查詢是傳回指定查詢之計劃節點的範例：

```
select nodeid as id,
       plannode,
       info
from stl_explain
where query=1042904 
order by nodeid;
```

上述查詢會傳回下列輸出。



![傳回查詢計劃節點的查詢輸出。](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/query-lifecycle-redshift/images/query-output.png)


`EXPLAIN` 計畫會傳回每個操作的實用指標，包括成本、資料列和寬度的指標。例如，上述查詢的第 7 行會傳回下列項目：

```
->  XN Hash Join DS_DIST_NONE  (cost=21364.58..273387.85 rows=5698378 width=14)
```

### 費用
<a name="query-plan-cost"></a>

成本是相對值，有助於比較計劃中的操作。成本包含兩個小數值，相隔兩個期間。在此範例中，成本等於 `21364.58..273387.85`。考慮下列各項：
+ 第一個值 （在此案例中為 `21364.58`) 提供傳回此操作第一列的相對成本。
+ 第二個值 （在此案例中為 `273387.85`) 提供完成操作的相對成本。 

查詢計劃中的成本是累積的，並從較低資料列累計到較高資料列。在上述範例輸出中，第 7 列會在本身下方的資料列 （即第 8–12 列及更高） 中包含其他操作的成本。

### 資料列
<a name="query-plan-rows"></a>

資料列是要傳回的估計資料列數。在此範例中，掃描預期會傳回 5，698，378 個資料列。資料列預估是根據 `ANALYZE`命令產生的可用統計資料。如果 最近`ANALYZE`尚未執行，則預估值較不可靠。

### 寬度
<a name="query-plan-width"></a>

寬度是平均資料列的預估寬度，以位元組為單位。在此範例中，平均資料列預期為 14 個位元組寬。