Amazon Redshift 查询计划的 EXPLAIN 数据重新分配 - AWS 规范性指导

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

Amazon Redshift 查询计划的 EXPLAIN 数据重新分配

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

联接的 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:表示联接中的两个表均被重新分配到所有节点。这是最差的选择。