解释亚马逊 Redshift 查询计划的运算符 - AWS 规范性指导

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

解释亚马逊 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 运算符

查询计划使用以下运算符来处理涉及使用UNIONINTERSECT、和进行集合运算的查询EXCEPT

  • 子查询-用于运行UNION查询

  • Hash Intersect D istinct — 用于运行查询 INTERSECT

  • SetOp 除外-用于运行EXCEPT(或MINUS)查询

其他运算符

以下运算符也经常出现在例行查询的EXPLAIN输出中:

  • 唯一-删除SELECT DISTINCT查询和UNION查询的重复项

  • 限制-处理子LIMIT

  • 窗口-运行窗口函数

  • 结果-运行不涉及任何表访问的标量函数

  • 子计划-用于某些子查询

  • 网络-将中间结果发送到领导节点以进行进一步处理

  • M@@ aterializ e-保存行以供嵌套循环联接和一些合并联接的输入