本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
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:标量聚合函数(如
AVG和SUM)的运算符 -
HashAggregate:未排序分组聚合函数的运算符
-
GroupAggregate:已排序分组聚合函数的运算符
排序运算符
当查询必须对结果集进行排序或合并时,查询计划使用以下运算符:
-
Sort:评估
ORDER BY子句和其他排序操作,例如UNION查询和联接、SELECT DISTINCT查询和窗口函数所需的排序 -
Merge:根据从并行操作得到的临时排序结果,来生成最终排序结果
UNION、INTERSECT 和 EXCEPT 运算符
查询计划将以下运算符用于涉及使用 UNION、INTERSECT 和 EXCEPT 进行集合操作的查询:
-
Subquery:用于运行
UNION查询 -
Hash Intersect Distinct:用于运行
INTERSECT查询 -
SetOp Except:用于运行
EXCEPT(或MINUS)查询
其他运算符
以下运算符也经常出现在例行查询的 EXPLAIN 输出中:
-
Unique:删除
SELECT DISTINCT查询和UNION查询的重复项 -
Limit:处理
LIMIT子句 -
Window:运行窗口函数
-
Result:运行不涉及任何表访问的标量函数
-
Subplan:用于特定的子查询
-
Network:将临时结果发送到领导节点,以待进一步处理
-
Materialize:保存行作为嵌套循环联接和某些合并联接的输入