本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Amazon Redshift 查詢計畫的 EXPLAIN 運算子
本節簡短說明您在EXPLAIN
輸出中最常看到的運算子。
循序掃描
循序掃描運算子 (Seq Scan) 指出資料表掃描。序列掃描會從頭到尾依序掃描資料表中的每個資料欄,並評估每一列的查詢限制 (在 WHERE
子句中)。
聯結運算子
Amazon Redshift 會根據要聯結資料表的實體設計、聯結所需的位置資料,以及查詢本身的特定需求來選取聯結運算子。
巢狀迴圈
巢狀迴圈主要用於跨聯結。交叉聯結是沒有聯結條件的聯結,會造成兩個資料表的笛卡兒乘積。巢狀迴圈通常會以巢狀迴圈聯結的形式執行,這是可能的聯結類型中最慢的。如果巢狀迴圈存在,您可以在 STL_ALERT_EVENT_LOG 檢視中看到巢狀迴圈警示事件。您可以執行下列查詢,以識別具有巢狀迴圈的查詢:
select q.query, trim(q.querytxt) as sql_query, q.starttime from stl_query q join stl_alert_event_log l on l.query = q.query and l.event like 'Nested Loop Join in the query plan%' order by q.starttime desc;
雜湊聯結和雜湊
雜湊聯結和雜湊運算子通常比巢狀迴圈聯結更快。這些運算子用於內部聯結和左右外部聯結。您可以在聯結資料表時,使用雜湊聯結和雜湊運算子,其中聯結資料欄不是分佈索引鍵和排序索引鍵。雜湊運算子會為聯結中的內部資料表建立雜湊資料表。雜湊聯結運算子會讀取外部資料表、雜湊聯結欄,並在內部雜湊資料表中找到相符項目。
合併聯結
合併聯結運算子通常是最快的聯結,用於內部聯結和外部聯結。合併聯結不會用於完整聯結。您可以在聯結資料表時,使用合併聯結,其中聯結資料欄同時是分佈索引鍵和排序索引鍵,以及未排序少於 20% 的聯結資料表時。合併聯結運算子會依序讀取兩個排序的資料表,並尋找相符的資料列。若要檢視未排序資料列的百分比,請查詢 SVV_TABLE_INFO 系統資料表。
彙整運算子
查詢計畫會在涉及彙總函數和GROUP BY
操作的查詢中使用下列運算子:
-
彙總 – 純量彙總函數的運算子,例如
AVG
和SUM
-
HashAggregate – 未排序分組彙總函數的運算子
-
GroupAggregate – 排序分組彙總函數的運算子
排序運算子
當查詢必須排序或合併結果集時,查詢計畫會使用下列運算子:
-
排序 – 評估
ORDER BY
子句和其他排序操作,例如UNION
查詢和聯結、SELECT DISTINCT
查詢和視窗函數所需的排序 -
合併 – 根據衍生自平行操作的中繼排序結果產生最終排序結果
UNION、INTERSECT 和 EXCEPT 運算子
查詢計畫會將下列運算子用於涉及使用 UNION
、 INTERSECT
和 設定操作的查詢EXCEPT
:
-
子查詢 – 用來執行
UNION
查詢 -
Hash Intersect Distinct – 用來執行
INTERSECT
查詢 -
SetOp 除外 – 用於執行
EXCEPT
(或MINUS
) 查詢
其他運算子
下列運算子也會經常出現在例行查詢的EXPLAIN
輸出中:
-
唯一 – 移除
SELECT DISTINCT
查詢和UNION
查詢的重複項目 -
限制 – 處理
LIMIT
子句 -
視窗 – 執行視窗函數
-
結果 – 執行不涉及任何資料表存取的純量函數
-
子計畫 – 用於特定子查詢
-
網路 – 將中繼結果傳送至領導節點以進行進一步處理
-
具體化 – 將輸入資料列儲存至巢狀迴圈聯結和一些合併聯結