本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
EXPLAIN
顯示查詢陳述式的執行計畫,但不執行查詢。
Syntax (語法)
EXPLAIN [ VERBOSE ] query
參數
- 詳細
-
顯示完整查詢計畫,不只是摘要而已。
- query
-
要說明的查詢陳述式。查詢可以是 SELECT、INSERT、CREATE TABLE AS、UPDATE 或 DELETE 陳述式。
使用須知
EXPLAIN 效能有時會受到建立臨時資料表所需的時間影響。例如,使用通用子表達式最佳化的查詢需建立並分析臨時資料表,以便傳回 EXPLAIN 輸出。查詢計畫取決於臨時資料表的結構描述和統計資訊。因此,此類型查詢的 EXPLAIN 命令可能需要比預期更長的執行時間。
您只能針對下列命令使用 EXPLAIN:
-
SELECT
-
SELECT INTO
-
CREATE TABLE AS
-
INSERT
-
UPDATE
-
DELETE
若您將 EXPLAIN 命令用於其他 SQL 命令,例如資料定義語言 (DDL) 或資料庫操作,則此命令將會失敗。
查詢計劃和執行步驟
特定 Amazon Redshift 查詢陳述式的執行計畫會將查詢的執行和計算細分成一系列分散的步驟和資料表操作,這些最後會產生查詢的最終結果集。如需查詢規劃的相關資訊,請參閲查詢處理。
下表摘要了 Amazon Redshift 在制定用户提交執行的任何查詢執行計畫時可使用的步驟。
EXPLAIN 運算子 | 查詢執行步驟 | 描述 |
---|---|---|
SCAN: | ||
Sequential Scan | scan | Amazon Redshift 關係掃描或資料表掃描運算子或步驟。從開頭到結尾循序掃描整個資料表;如 WHERE 子句中有指定,也會評估每個資料列的查詢限制條件 (篩選條件)。還會用來執行 INSERT、UPDATE 和 DELETE 陳述式。 |
聯結:根據要聯結資料表的物理設計、聯結所需資料的位置,以及查詢本身的特定屬性,Amazon Redshift 會使用不同的聯結運算子。子查詢掃描 – 子查詢掃描和附加會用來執行 UNION 查詢。 | ||
巢狀迴路 | nloop | 最差聯結;主要用於交叉聯結 (笛卡兒乘積;無聯結條件) 和一些不相等聯結中。 |
雜湊聯結 | hjoin | 同樣用於內部聯結和左右外部聯結,且通常會較巢狀迴路聯結更快速。雜湊聯結會讀取外部資料表、雜湊聯結資料欄,並在內部雜湊表中尋找相符項目。步驟可溢寫至磁碟。(hjoin 的內部輸出可以是磁碟型的雜湊步驟。) |
合併聯結 | mjoin | 同樣用於內部聯結和外部聯結 (針對在聯結資料欄上進行分佈和排序的聯結資料表)。通常是速度最快的 Amazon Redshift 聯結算法,不包括其他成本考量。 |
彙總:使用於涉及彙總函數和 GROUP BY 操作的查詢的運算子和步驟。 | ||
Aggregate | aggr | 純量彙整函數的運算子/步驟。 |
HashAggregate | aggr | 分組彙整函數的運算子/步驟。可從磁碟透過溢寫至磁碟的雜湊資料表操作。 |
GroupAggregate | aggr | 有時會針對分組彙整查詢選擇的運算子,在 Amazon Redshift Force_hash_分組設置設置為關閉的情況下。 |
排序:查詢必須排序或合併結果集時使用的運算子和步驟。 | ||
Sort | sort | Sort 會執行 ORDER BY 子句及其他操作所指定的排序,例如 UNION 和聯結。可從磁碟操作。 |
合併 | merge | 根據衍生自平行執行之操作的中繼排序結果,產生查詢的最終排序結果。 |
EXCEPT、INTERSECT 和 UNION 操作: | ||
SetOp Except [Distinct] | hjoin | 用於 EXCEPT 查詢。根據輸入雜湊可以是磁碟型的事實,可從磁碟操作。 |
Hash Intersect [Distinct] | hjoin | 用於 INTERSECT 查詢。根據輸入雜湊可以是磁碟型的事實,可從磁碟操作。 |
Append [All |Distinct] | save | Append 搭配 Subquery Scan 實作 UNION 和 UNION ALL 查詢。可根據 "save" 從磁碟操作。 |
其他: | ||
Hash | hash | 用於內部聯結和左右外部聯結 (對雜湊聯結提供輸入)。Hash 運算子會為聯結的內部資料表建立雜湊資料表 (內部資料表是在兩個資料表的聯結中,要查看其中是否有相符項目的資料表,通常是兩個資料表中較小的)。 |
限制 | limit | 評估 LIMIT 子句。 |
Materialize | save | 具體化資料列以輸入至巢狀迴路聯結和一些合併聯結。可從磁碟操作。 |
-- | parse | 在載入時用來剖析文字輸入資料。 |
-- | project | 用來重新安排資料欄和表達式,也就是專案資料。 |
結果 | -- | 執行未牽涉任何資料表存取的純量函數。 |
-- | return | 將資料列傳回至領導者或用戶端。 |
Subplan | -- | 用於特定子查詢。 |
唯一 | unique | 消除 SELECT DISTINCT 和 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。 |
範例
對於這些範例,範例輸出可能因 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)