【问题标题】:How do query joins work in MPP databases?查询连接如何在 MPP 数据库中工作?
【发布时间】:2016-01-23 07:15:52
【问题描述】:

我想知道 SQL 连接在像 Greenplum 这样的 MPP 数据库中是如何工作的,如果我想连接分布在多个段节点上的两个大表,那么数据是如何处理的?

主节点是否从所有节点获取所有相关数据,然后加入并返回结果集?如果您要执行许多这些类型的表连接,这会不会成为一个很大的瓶颈?

我从here找到以下内容:

MPP 数据库尝试将数据分段到多个服务器,以便每个服务器节点可以独立于其他节点工作。例如,要在大表和小表之间执行 JOIN,MPP 数据库将在每个节点上存储大表中的行子集,以及整个小表的副本。然后每个节点可以独立于其他节点执行 JOIN,从而消除共享资源造成的瓶颈。这实现了大规模并行处理,其中一个大型查询可以分解为一组较小的查询,每个查询在单独的服务器上独立运行。

这专门讨论了连接一个小表,但没有提到连接两个大表..

【问题讨论】:

标签: database join greenplum bigdata


【解决方案1】:

如果两个表由相同的键分布,则连接发生在每个段的本地。如果您要连接两个非常大的表,建议您使用相同的键分布这些表。

如果两个表不是按相同的键分布,Greenplum 会使用表的统计信息将数据从较小的表复制到较大的表的位置来执行连接。现在,它不会移动一切。它只移动它需要的数据。

假设您有非常大的预测表和实际表,并且由不同的键分布。实际值大于预测值,您的比较过滤器仅预测一个月。 Greenplum 将创建一个仅查询该月预测表的切片,然后将结果发送到其他段以连接到实际表中。意识到这是在每个段上并行完成的,使其非常快速和可扩展。

主服务器创建查询计划并管理执行,但在查询完成之前数据不会发送到主服务器。查询由段处理。所以不,主节点不会“从所有节点获取所有相关数据,然后加入并返回结果集”。

【讨论】:

    【解决方案2】:

    这里也是最佳实践论文:(https://support.pivotal.io/hc/en-us/articles/204910827-White-Paper-Pivotal-Greenplum-GPDB-Best-Practices-) 描述了 colocated-join 和分布。

    希望这些对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-06
      • 2018-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多