我想知道SQL如何在像Greenplum这样的MPP数据库中工作,如果我想在分布在多个段节点上的两个大表之间加入,那么数据是如何处理的?
主节点是否从所有节点获取所有相关数据,然后进行加入并返回结果集?如果您要进行许多这类表连接,这不会成为一个很大的瓶颈吗?
我从here找到了以下内容:
MPP数据库尝试跨多个服务器对数据进行分段,以便每个服务器节点可以独立于其他服务器节点工作。例如,要在大表和小表之间执行JOIN,MPP数据库将在每个节点上存储来自大表的行的子集,以及整个小表的副本。然后,每个节点可以独立于其他节点执行JOIN,从而消除共享资源创建的瓶颈。这可以实现大规模并行处理,其中大型查询可以分解为一组较小的查询,每个查询都在一个单独的服务器上独立运行。
这是专门讨论与小表的连接,但没有提及加入两个大表..
答案 0 :(得分:2)
如果两个表由相同的密钥分发,则连接在每个段的本地发生。如果要连接两个非常大的表,建议您使用相同的密钥分发表。
如果两个表没有通过相同的密钥分发,Greenplum将使用表的统计信息将数据从较小的表复制到较大的表的位置以执行连接。现在,它并没有移动一切。它只会移动所需的数据。
假设您有预测和实际表格,这些表格非常大并且由不同的密钥分发。实际值大于预测值,您的比较过滤器仅预测一个月。 Greenplum将创建一个切片,仅查询该月的预测表,然后将结果发送到其他段以加入实际表。实现这一点在每个细分市场上并行完成,使其极其快速和可扩展。
主服务器创建查询计划并管理执行,但在查询完成之前,数据不会发送到主服务器。查询由段处理。所以不,主节点不“从所有节点获取所有相关数据,然后进行连接并返回结果集”。
答案 1 :(得分:0)
这里也是最佳实践论文:(https://support.pivotal.io/hc/en-us/articles/204910827-White-Paper-Pivotal-Greenplum-GPDB-Best-Practices-)描述了共置连接和分发。
希望这些有用。