Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 查询联接如何在MPP数据库中工作?_Database_Join_Greenplum_Bigdata - Fatal编程技术网

Database 查询联接如何在MPP数据库中工作?

Database 查询联接如何在MPP数据库中工作?,database,join,greenplum,bigdata,Database,Join,Greenplum,Bigdata,我想知道SQL联接在诸如Greenplum这样的MPP数据库中是如何工作的,如果我想联接分布在多个段节点上的两个大型表,那么数据是如何处理的 主节点是否从所有节点获取所有相关数据,然后进行连接并返回结果集?如果要执行许多此类表联接,这难道不是一个很大的瓶颈吗 我从中发现了以下内容: MPP数据库尝试跨多个服务器对数据进行分段,以便每个服务器节点可以独立于其他服务器工作。例如,要在大表和小表之间执行联接,MPP数据库将在每个节点上存储大表中的行子集以及整个小表的副本。然后,每个节点都可以独立于其他

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

主节点是否从所有节点获取所有相关数据,然后进行连接并返回结果集?如果要执行许多此类表联接,这难道不是一个很大的瓶颈吗

我从中发现了以下内容:

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


这专门讨论了与小表的联接,但没有提到联接两个大表。

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

如果两个表不是由同一个键分发的,Greenplum将使用表的统计信息将数据从较小的表复制到较大表的位置以执行联接。现在,它不能移动所有东西。它只移动所需的数据

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


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

这里的最佳实践论文:()描述了共定位联接和分布


希望这些都有帮助。

这个博客应该有助于理解: