

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

# Amazon Redshift 查询计划的 EXPLAIN 运算符
<a name="explain-operators"></a>

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

## 顺序扫描
<a name="sequential-scan"></a>

顺序扫描运算符 (Seq Scan) 指示表扫描。Seq Scan 从开始到结束按顺序扫描表中的每一列，并计算每一行的查询约束（在 `WHERE` 子句中）。

## 联接运算符
<a name="join-operators"></a>

Amazon Redshift 根据要联接的表的物理设计、联接所需的数据的位置以及查询本身的特定要求来选择联接运算符。

### 嵌套循环
<a name="join-nested-loop"></a>

嵌套循环主要用于交叉联接。交叉联接是无联接条件的联接，它会导致对两个表执行笛卡尔积操作。嵌套循环通常作为嵌套循环联接运行，这是最慢的可能联接类型。如果存在嵌套循环，您可能会在 [STL\_ALERT\_EVENT\_LOG](https://docs.aws.amazon.com/redshift/latest/dg/r_STL_ALERT_EVENT_LOG.html) 视图中看到嵌套循环提醒事件。您可运行以下查询来识别包含嵌套循环的查询：

```
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;
```

### 哈希联接和哈希
<a name="join-hash"></a>

哈希联接和哈希运算符通常比嵌套循环联接更快。这些运算符用于内部联接以及左右外部联接。如果联接列并非同时为分配键和排序键，联接表时可以使用哈希联接和哈希运算符。哈希运算符为联接中的内部表创建哈希表。哈希联接运算符读取外部表，对联接列进行哈希处理，然后在内部哈希表查找匹配项。

### 合并联接
<a name="join-merge"></a>

合并联接运算符通常是最快的联接，用于内部联接和外部联接。合并联接不用于完全联接。如果联接列同时为分配键和排序键，且未排序的联接表少于 20%，则联接表时可以使用合并联接。合并联接运算符按顺序读取两个已排序的表并查找匹配的行。要查看未排序行的百分比，请查询 [SVV\_TABLE\_INFO](https://docs.aws.amazon.com/redshift/latest/dg/r_SVV_TABLE_INFO.html) 系统表。

## 聚合运算符
<a name="aggregate-operators"></a>

查询计划在涉及聚合函数和 `GROUP BY` 操作的查询中使用以下运算符：
+ **Aggregate**：标量聚合函数（如 `AVG` 和 `SUM`）的运算符
+ **HashAggregate**：未排序分组聚合函数的运算符
+ **GroupAggregate**：已排序分组聚合函数的运算符

### 排序运算符
<a name="operators-sort"></a>

当查询必须对结果集进行排序或合并时，查询计划使用以下运算符：
+ **Sort**：评估 `ORDER BY` 子句和其他排序操作，例如 `UNION` 查询和联接、`SELECT DISTINCT` 查询和窗口函数所需的排序
+ **Merge**：根据从并行操作得到的临时排序结果，来生成最终排序结果

### UNION、INTERSECT 和 EXCEPT 运算符
<a name="operators-union"></a>

查询计划将以下运算符用于涉及使用 `UNION`、`INTERSECT` 和 `EXCEPT` 进行集合操作的查询：
+ **Subquery**：用于运行 `UNION` 查询
+ **Hash Intersect Distinct**：用于运行 `INTERSECT` 查询
+ **SetOp Except**：用于运行 `EXCEPT`（或 `MINUS`）查询

### 其他运算符
<a name="operators-other"></a>

以下运算符也经常出现在例行查询的 `EXPLAIN` 输出中：
+ **Unique**：删除 `SELECT DISTINCT` 查询和 `UNION` 查询的重复项
+ **Limit**：处理 `LIMIT` 子句
+ **Window**：运行窗口函数
+ **Result**：运行不涉及任何表访问的标量函数
+ **Subplan**：用于特定的子查询
+ **Network**：将临时结果发送到领导节点，以待进一步处理
+ **Materialize**：保存行作为嵌套循环联接和某些合并联接的输入