Amazon Redshift 查询计划的 EXPLAIN 运算符 - AWS 规范性指导

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

Amazon Redshift 查询计划的 EXPLAIN 运算符

本节简要介绍了在 EXPLAIN 输出中最常见的运算符。

顺序扫描

顺序扫描运算符 (Seq Scan) 指示表扫描。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 操作的查询中使用以下运算符:

  • Aggregate:标量聚合函数(如 AVGSUM)的运算符

  • HashAggregate:未排序分组聚合函数的运算符

  • GroupAggregate:已排序分组聚合函数的运算符

排序运算符

当查询必须对结果集进行排序或合并时,查询计划使用以下运算符:

  • Sort:评估 ORDER BY 子句和其他排序操作,例如 UNION 查询和联接、SELECT DISTINCT 查询和窗口函数所需的排序

  • Merge:根据从并行操作得到的临时排序结果,来生成最终排序结果

UNION、INTERSECT 和 EXCEPT 运算符

查询计划将以下运算符用于涉及使用 UNIONINTERSECTEXCEPT 进行集合操作的查询:

  • Subquery:用于运行 UNION 查询

  • Hash Intersect Distinct:用于运行 INTERSECT 查询

  • SetOp Except:用于运行 EXCEPT(或 MINUS)查询

其他运算符

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

  • Unique:删除 SELECT DISTINCT 查询和 UNION 查询的重复项

  • Limit:处理 LIMIT 子句

  • Window:运行窗口函数

  • Result:运行不涉及任何表访问的标量函数

  • Subplan:用于特定的子查询

  • Network:将临时结果发送到领导节点,以待进一步处理

  • Materialize:保存行作为嵌套循环联接和某些合并联接的输入