本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
解释亚马逊 Redshift 查询计划的运算符
本节简要介绍了您在EXPLAIN
输出中最常看到的运算符。
顺序扫描
顺序扫描运算符 (Seq Scan) 指示表扫描。Seq Scan 从头到尾按顺序扫描表中的每一列,并评估每行的查询约束(在WHERE
子句中)。
联接运算符
Amazon Redshift 根据要联接的表的物理设计、联接所需的数据的位置以及查询本身的特定要求来选择联接运算符。
嵌套循环
嵌套循环主要用于交叉连接。交叉联接是无联接条件的联接,它会导致对两个表执行笛卡尔积操作。嵌套循环通常以嵌套循环连接的形式运行,嵌套循环连接是可能的联接类型中最慢的一种。如果存在嵌套循环,则可以在 STL_ALERT_EVENT_L OG 视图中看到嵌套循环警报事件。您可以运行以下查询来识别具有嵌套循环的查询:
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
查询和窗口函数所需的排序 -
Merge — 根据并行操作得出的中间排序结果生成最终排序结果
UNION、INTERSECT 和 EXCEPT 运算符
查询计划使用以下运算符来处理涉及使用UNION
INTERSECT
、和进行集合运算的查询EXCEPT
:
-
子查询-用于运行
UNION
查询 -
Hash Intersect D istinct — 用于运行查询
INTERSECT
-
SetOp 除外-用于运行
EXCEPT
(或MINUS
)查询
其他运算符
以下运算符也经常出现在例行查询的EXPLAIN
输出中:
-
唯一-删除
SELECT DISTINCT
查询和UNION
查询的重复项 -
限制-处理子
LIMIT
句 -
窗口-运行窗口函数
-
结果-运行不涉及任何表访问的标量函数
-
子计划-用于某些子查询
-
网络-将中间结果发送到领导节点以进行进一步处理
-
M@@ aterializ e-保存行以供嵌套循环联接和一些合并联接的输入