

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

# Amazon Redshift 查询计划的 EXPLAIN 数据重新分配
<a name="explain-redistribution"></a>

在联接步骤中，切片可能需要处理未存储在本地的数据，而网络传输（计算节点之间的数据移动）是最昂贵的查询操作。

联接的 `EXPLAIN` 输出还指定在集群上移动数据以便进行联接的方法。数据移动可以采用广播方法或重新分配。
+ 在广播中，联接一侧的数据值将从每个计算节点复制到每个其他计算节点，以便每个计算节点最终得到数据的完整副本。
+ 在重新分配中，参与的数据值从其当前切片发送到新切片（可能位于不同节点上）。如果该分配键是联接列之一，则通常会重新分配数据以匹配参与联接的其他表的分配键。如果两个表在其中一个联接列上都没有分配键，则两个表都会被分配，或者内部表将广播到每个节点。

`EXPLAIN` 输出还引用内部表和外部表。
+ 首先扫描内部表，并在查询计划底部附近显示。内部表是用于在构建表中查找匹配行的表。通常，保留在内存中的内部表是哈希的源表，如果可能的话，是两者中较小的表。
+ 外部表是要与内部表匹配的行的来源，通常从磁盘读取。查询优化器根据最新运行的 `ANALYZE` 命令中的数据库统计信息选择内部表和外部表。查询的 `FROM` 子句中的表顺序不区分内部表和外部表。

您可以通过查询计划中的以下属性了解数据的移动方式，以便执行查询：
+ **DS\_BCAST\_INNER**：表示正在将整个内部联接表的副本广播到所有计算节点。
+ **DS\_DIST\_ALL\_NONE**：无需重新分配，因为内部表已经使用 `DISTSTYLE ALL` 被分配到每个节点。每个计算节点上都有整个表。
+ **DS\_DIST\_NONE**：无需重新分配，因为相应的切片已在计算节点上并置。这是最高效的选择，因为没有网络传输。
+ **DS\_DIST\_INNER**：表示内部联接表已重新分配。如果内部表小得多或不经常更新，可以考虑将该表更改为 `DISTSTYLE ALL`。
+ **DS\_DIST\_OUTER**：表示外部联接表已重新分配。如果外部表小得多或不经常更新，请考虑将该表更改为 `DISTSTYLE ALL`。
+ **DS\_DIST\_ALL\_INNER**：表示由于联接表使用了 `DISTSTYLE ALL`，因此将内部联接表发送到单个节点。此联接在单个节点上执行，可能会很慢。
+ **DS\_DIST\_BOTH**：表示联接中的两个表均被重新分配到所有节点。这是最差的选择。