

# 了解 Athena EXPLAIN 语句结果
<a name="athena-explain-statement-understanding"></a>

本主题提供了 Athena `EXPLAIN` 语句结果中使用的操作术语的简要指南。

## EXPLAIN 语句输出类型
<a name="athena-explain-statement-understanding-explain-plan-types"></a>

`EXPLAIN` 语句输出可以是以下两种类型之一：
+ **逻辑计划** – 显示 SQL 引擎用于执行语句的逻辑计划。该选项的语法为 `EXPLAIN` 或者 `EXPLAIN (TYPE LOGICAL)`。
+ **分布式计划** – 显示分布式环境中的执行计划。输出显示片段，这些片段是处理阶段。每个计划片段由一个或多个节点进行处理。数据可以在处理片段的节点之间进行交换。该选项的语法为 `EXPLAIN (TYPE DISTRIBUTED)`。

  在分布式计划的输出中，片段（处理阶段）由 `Fragment` *number* [*fragment\$1type*] 表示，其中 *number* 是一个从零开始的整数，*fragment\$1type* 指定节点如何执行片段。下表介绍了片段类型，它们提供了解数据交换布局的洞察。  
**分布式计划片段类型**    
[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/athena/latest/ug/athena-explain-statement-understanding.html)

## Exchange
<a name="athena-explain-statement-understanding-exchange-types"></a>

与交换相关的术语描述了如何在工件节点之间交换数据。传输可以是本地传输或远程传输。

**LocalExchange [*exchange\$1type*] **  
针对查询的不同阶段，在工件节点内本地传输数据。*exchange\$1type* 的值可以是逻辑交换或分布式交换类型之一，如本部分后文所述。

**RemoteExchange [*exchange\$1type*] **  
为查询的不同阶段在工件节点之间传输数据。*exchange\$1type* 的值可以是逻辑交换或分布式交换类型之一，如本部分后文所述。

### 逻辑交换类型
<a name="athena-explain-statement-understanding-exchange-types-logical"></a>

以下交换类型描述了在逻辑计划的交换阶段执行的操作。
+ **`GATHER`** – 单个工件节点从所有其他工件节点收集输出。例如，特定查询的最后阶段从所有节点收集结果，并将结果写入 Amazon S3。
+ **`REPARTITION`**– 根据应用于下一个运算符所需的分区方案，将行数据发送到特定的工件。
+ **`REPLICATE`** – 将行数据复制到所有工件。

### 分布式交换类型
<a name="athena-explain-statement-understanding-exchange-types-distributed"></a>

以下交换类型指示数据在分布式计划中的节点之间交换时的布局。
+ **`HASH`** – 交换使用哈希函数将数据分发到多个目标。
+ **`SINGLE`** – 交换将数据分发到单个目标。

## 扫描
<a name="athena-explain-statement-understanding-scanning"></a>

以下术语描述了在查询过程中扫描数据的方式。

**TableScan **  
从 Amazon S3 或 Apache Hive 连接器扫描表的源数据，并应用从筛选条件谓词生成的分区修剪。

**ScanFilter **  
从 Amazon S3 或 Hive 连接器扫描表的源数据，并应用从筛选条件谓词和未通过分区修剪应用的其他筛选条件谓语生成的分区修剪。

**ScanFilterProject **  
首先，从 Amazon S3 或 Hive 连接器扫描表的源数据，并应用从筛选条件谓词和未通过分区修剪应用的其他筛选条件谓词生成的分区修剪。然后，将输出数据的内存布局修改为新投影，以提高后续阶段的性能。

## 联接
<a name="athena-explain-statement-understanding-join"></a>

在两个表之间连接数据。可以按连接类型和分配类型对连接进行分类。

### 联接类型
<a name="athena-explain-statement-understanding-join-types"></a>

联接类型定义联接操作的发生方式。

**CrossJoin** – 生成连接的两个表的笛卡尔积。

**InnerJoin** – 选择两个表中具有匹配值的记录。

**LeftJoin** – 从左表中选择所有记录，从右表中选择匹配记录。如果没有匹配，则右侧的结果为 NULL。

**RightJoin** – 从右表中选择所有记录，从左表中选择匹配记录。如果没有匹配，则左侧的结果为 NULL。

**FullJoin** – 选择左表或右表记录中存在匹配项的所有记录。连接的表包含两侧表中的所有记录，以及任一侧缺少匹配项填充的空值。

**注意**  
出于性能考虑，查询引擎可以将连接查询重写为不同的连接类型以生成相同的结果。例如，在一个表上具有谓词的内部连接查询可以被重写为 `CrossJoin`。这会将谓词下推到表的扫描阶段，以减少扫描的数据量。

### 联接分配类型
<a name="athena-explain-statement-understanding-join-distribution-types"></a>

分配类型定义执行连接操作时，如何在工件节点之间交换数据。

**已分区** – 左表和右表在所有工件节点之间进行哈希分区。已分区分配在每个节点中消耗的内存较少。已分区分配可能比复制的连接慢得多。当您连接两个大型表时，适合使用已分区连接。

**已复制** – 一个表在所有工件节点之间进行哈希分区，另一个表被复制到所有工件节点以执行连接操作。复制的分配比已分区的连接快得多，但它在每个工件节点中将占用更多的内存。如果复制的表太大，则工件节点可能会遇到内存不足的错误。复制的连接适用于其中一个连接表较小的情况。