SQL:联接操作的并行性在“a”中到底是如何工作的;“不分享任何东西”;建筑学

SQL:联接操作的并行性在“a”中到底是如何工作的;“不分享任何东西”;建筑学,sql,join,parallel-processing,relation,Sql,Join,Parallel Processing,Relation,我目前正在读一本关于DBMS中并行性的书,我发现很难理解并行性在连接操作中是如何工作的 假设我们有10个系统,每个系统都有自己的磁盘空间和主内存。有一个网络,系统可以通过该网络相互通信,例如共享数据 现在假设我们有以下操作:A(X,Y)连接B(Y,Z) 表A和B太大了,所以我们希望使用并行性来获得更好的整体计算速度 我们要做的是对a表和B表的每个记录的“Y”属性应用一个哈希函数,然后将这些记录发送到不同的系统。然后,每个系统都可以使用一个局部算法来连接它们获得的记录 我不明白的是,初始哈希函数到

我目前正在读一本关于DBMS中并行性的书,我发现很难理解并行性在连接操作中是如何工作的

假设我们有10个系统,每个系统都有自己的磁盘空间和主内存。有一个网络,系统可以通过该网络相互通信,例如共享数据

现在假设我们有以下操作:A(X,Y)连接B(Y,Z)

表A和B太大了,所以我们希望使用并行性来获得更好的整体计算速度

我们要做的是对a表和B表的每个记录的“Y”属性应用一个哈希函数,然后将这些记录发送到不同的系统。然后,每个系统都可以使用一个局部算法来连接它们获得的记录

我不明白的是,初始哈希函数到底应用在哪里,初始表A和B到底存储在哪里

当我阅读时,我认为我们有另一个“主”系统,它也有自己的磁盘空间,在这个空间中我们有所有的初始信息,即表A和表B及其所有记录。该系统使用自己的主存来应用初始散列函数,该函数为每个记录确定系统最终将进入和处理的总共10个位置

然而,在阅读之后,我陷入了下面的例子(我从希腊语翻译过来)

假设我们有两个表R(X,Y)连接s(Y,Z),其中R有1000页,s有500页。假设我们有10个系统可以并行使用。因此,我们首先使用散列函数来确定应该将每条记录发送到哪里。读取表R和S所需的I/O总量为1500,每个系统为150每个系统将有15页的数据,这些数据对于其余的每个系统都是必需的,因此它会向其他9个系统发送135页数据。因此,总通信量为1350页。

我真的不明白粗体部分。为什么一个系统必须向其他系统发送任何数据?我之前提到的“主”系统不是做这项工作吗

我想象这样的情况:

               main_system
                  ||
                  \/
            apply_hash(record)
                  ||
                  \/
              send record to the appropriate system
              / /  /  /  /  /  /  /  /  /  
            s1 s2 s3 s4 s5 s6 s7 s8 s9 s10
现在所有系统都有自己的记录,它们应用本地算法并将结果输出。系统之间没有通信,我在这里遗漏了什么??这本书使用了不同的方法吗?如果是的话,是哪种方法?因为我已经读了同一单元3遍了,但仍然没有理解(可能是一个糟糕的翻译,但不确定)


提前感谢

我猜你的连接是本地客户。由于它与所有机器都有连接。

在无共享系统中,数据通常在创建数据时跨处理器进行分区。虽然数据库可以不共享,但最好的文档可能是针对Hadoop和HDFS,即Hadoop分布式文件系统

函数将行分配给分区。一些例子是:循环,其中新行一个接一个地分配给处理器;基于范围,其中根据列的值将行分配给处理器;基于哈希的,其中基于值的哈希将行分配给处理器。对数据进行分区的过程非常类似于SQL Server和Oracle等数据库中的“分区”,这些数据库不在无共享环境中

如果您的联接对两个表都使用分区键,并且分区方法相同,那么数据已经是本地的。否则,需要重新分发一个或两个表以继续处理

在你引用的那一节中,你可能对算术感到困惑。请记住,如果您在10个处理器上有1500个页面,那么每个处理器将平均有150个页面。这些页面需要重新分发。假设你是处理器3。大约15页将进入处理器1;另一个15到处理器2。另一个连接到处理器3。等待你不必发送这些;他们已经在正确的位置上了。您只需向其他处理器发送9*15=135页

关键的想法是,在一个共享的notthing环境中,相同的处理器在进行处理时存储数据