EXPLAIN - Amazon Redshift

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

EXPLAIN

顯示查詢陳述式的執行計畫,但不執行查詢。如需有關查詢分析工作流程的資訊,請參閱 查詢分析工作流程

語法

EXPLAIN [ VERBOSE ] query

參數

VERBOSE

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

query

要說明的查詢陳述式。查詢可以是 SELECT、INSERT、CREATETABLEASUPDATE、 或 DELETE陳述式。

使用須知

EXPLAIN 效能有時會受到建立暫存資料表所需的時間所影響。例如,使用常見子表達最佳化的查詢需要建立和分析暫存資料表,才能傳回EXPLAIN輸出。查詢計畫取決於臨時資料表的結構描述和統計資訊。因此,這類查詢的EXPLAIN命令執行時間可能比預期更長。

EXPLAIN 您只能將 用於下列命令:

  • SELECT

  • SELECT INTO

  • CREATE TABLE AS

  • INSERT

  • UPDATE

  • DELETE

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

Amazon Redshift 會使用EXPLAIN輸出相對單位成本來選擇查詢計畫。Amazon Redshift 會比較各種資源估算值的大小來決定計畫。

查詢計劃和執行步驟

特定 Amazon Redshift 查詢陳述式的執行計畫會將查詢的執行和計算細分成一系列分散的步驟和資料表操作,這些最後會產生查詢的最終結果集。如需查詢計劃的資訊,請參閱 查詢處理

下表摘要說明 Amazon Redshift 在開發使用者提交執行的任何查詢執行計畫時可使用的步驟。

EXPLAIN 運算子 查詢執行步驟 描述
SCAN:
Sequential Scan scan Amazon Redshift 關聯式掃描或資料庫掃描運算子或步驟。從頭到尾依序掃描整個資料表;如果使用子WHERE句指定, 也會評估每一列 (篩選條件) 的查詢限制。也用於執行 INSERT、 UPDATE和 DELETE陳述式。
JOINS:Amazon Redshift 會根據要聯結之資料表的實體設計、聯結所需的資料位置,以及查詢本身的特定屬性,使用不同的聯結運算子。子查詢掃描 -- 子查詢掃描和附加會用來執行UNION查詢。
巢狀迴路 nloop 最差聯結;主要用於交叉聯結 (笛卡兒乘積;無聯結條件) 和一些不相等聯結中。
雜湊聯結 hjoin 同樣用於內部聯結和左右外部聯結,且通常會較巢狀迴路聯結更快速。雜湊聯結會讀取外部資料表、雜湊聯結資料欄,並在內部雜湊表中尋找相符項目。步驟可溢寫至磁碟。(hjoin 的內部輸出可以是磁碟型的雜湊步驟。)
合併聯結 mjoin 同樣用於內部聯結和外部聯結 (針對在聯結資料欄上進行分佈和排序的聯結資料表)。通常是速度最快的 Amazon Redshift 聯結演算法 (不納入其他成本考量的情況下)。
AGGREGATION:用於涉及彙總函數和 GROUP BY 操作之查詢的運算子和步驟。
Aggregate aggr 純量彙整函數的運算子/步驟。
HashAggregate aggr 分組彙整函數的運算子/步驟。可從磁碟透過溢寫至磁碟的雜湊資料表操作。
GroupAggregate aggr 有時會針對分組彙整查詢選擇的運算子,在 force_hash_grouping 設定的 Amazon Redshift 組態設定為關閉的情況下。
SORT:查詢必須排序或合併結果集時使用的運算子和步驟。
Sort sort 排序會執行 ORDER BY 子句指定的排序,以及 UNIONs和 聯結等其他操作。可從磁碟操作。
合併 merge 根據衍生自平行執行之操作的中繼排序結果,產生查詢的最終排序結果。
EXCEPT、 INTERSECT和 UNION操作:
SetOp 除了 【Distinct】 hjoin 用於EXCEPT查詢。根據輸入雜湊可以是磁碟型的事實,可從磁碟操作。
Hash Intersect [Distinct] hjoin 用於INTERSECT查詢。根據輸入雜湊可以是磁碟型的事實,可從磁碟操作。
Append [All |Distinct] save 附加與子查詢掃描搭配使用,以實作 UNION 和 UNION ALL 查詢。可根據 "save" 從磁碟操作。
其他:
Hash hash 用於內部聯結和左右外部聯結 (對雜湊聯結提供輸入)。Hash 運算子會為聯結的內部資料表建立雜湊資料表 (內部資料表是在兩個資料表的聯結中,要查看其中是否有相符項目的資料表,通常是兩個資料表中較小的)。
限制 limit 評估 LIMIT 子句。
Materialize save 具體化資料列以輸入至巢狀迴路聯結和一些合併聯結。可從磁碟操作。
-- parse 在載入時用來剖析文字輸入資料。
-- project 用來重新安排資料欄和表達式,也就是專案資料。
結果 -- 執行未牽涉任何資料表存取的純量函數。
-- return 將資料列傳回至領導者或用戶端。
Subplan -- 用於特定子查詢。
唯一 unique 消除來自 SELECTDISTINCT和 UNION查詢的重複項目。
視窗 window 運算彙整和排名視窗函數。可從磁碟操作。
網路操作:
Network (Broadcast) bcast Broadcast 也是 Join Explain 運算子和步驟的屬性。
Network (Distribute) dist 將資料列分佈至運算節點供資料倉儲叢集進行平行處理。
Network (Send to Leader) return 將結果傳回領導者供進一步處理。
DML 操作 (修改資料的運算子):
Insert (using Result) insert 插入資料。
Delete (Scan + Filter) 刪除 刪除資料。可從磁碟操作。
Update (Scan + Filter) delete, insert 實作為 delete 和 Insert。

使用 EXPLAIN for RLS

如果查詢包含受資料列層級安全 (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 會提供EXPLAINRLS系統許可。已授予此許可的使用者可以檢查完整的查詢計劃,其中也包含述RLS詞。

下列範例說明RLS SecureScan 節點下方的額外 Seq 掃描,也包含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)

將EXPLAINRLS許可授予使用者時,Amazon Redshift 會記錄完整的查詢計畫,包括 STL_EXPLAIN 系統資料表中的述RLS詞。未授予此許可時執行的查詢,將在沒有RLS內部的情況下進行記錄。授予或移除EXPLAINRLS許可不會變更 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 組態而有所不同。

下列範例會傳回VENUENAME從 EVENT和 VENUE資料表中選取 EVENTID、VENUEID、 EVENTNAME和 之查詢的查詢計劃:

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)