Amazon Redshift 中的查詢計畫 - AWS 方案指引

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

Amazon Redshift 中的查詢計畫

查詢計畫是執行引擎在對資料執行查詢時必須遵循的指示清單。您可以執行 EXPLAIN 命令,後面接著實際的查詢文字來建立查詢計劃,如下列範例查詢所示:

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_SUMMARYSVL_QUERY_REPORT 檢視來取得查詢摘要資訊。

Amazon Redshift 查詢編輯器第 2 版

您也可以使用查詢編輯器 v2 中的說明選項,在 Amazon Redshift 中檢視查詢計劃。如需說明,請參閱《Amazon Redshift 文件》中的使用查詢編輯器 v2

查詢編輯器 v2 產生的查詢計畫包含下列資訊:

  • 執行引擎執行的操作,從下到上讀取結果

  • 每個操作執行的步驟類型

  • 每個操作會使用哪些資料表和資料欄

  • 每個操作中處理的資料量,以位元組為單位的資料列數和資料寬度表示

  • 操作的相對成本 (成本是比較計畫中步驟相對執行時間的指標。 成本不會提供有關實際執行時間或記憶體耗用量的精確資訊,也不會在執行計畫之間提供有意義的比較。 不過,成本確實可讓您指出查詢中哪些操作耗用最多資源。)

EXPLAIN 計劃

您可以使用 STL_EXPLAIN 系統資料表來顯示已提交執行之查詢的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;

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

傳回查詢計劃節點的查詢輸出。

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

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

費用

成本是相對值,有助於比較計劃中的操作。成本包含兩個小數值,相隔兩個期間。在此範例中,成本等於 21364.58..273387.85。考慮下列各項:

  • 第一個值 (在此案例中為 21364.58) 提供傳回此操作第一列的相對成本。

  • 第二個值 (在此案例中為 273387.85) 提供完成操作的相對成本。 

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

資料列

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

寬度

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