SQL:连接操作的并行性在"shared nothing"体系结构中究竟是如何工作的?



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

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

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

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

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

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

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

然而,在阅读后,我陷入了以下例子(我从希腊语翻译)

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

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

我想是这样的:

               main_system
                  ||
                  /
            apply_hash(record)
                  ||
                  /
              send record to the appropriate system
              / /  /  /  /  /  /  /  /  /  
            s1 s2 s3 s4 s5 s6 s7 s8 s9 s10

现在所有系统都有自己的记录,它们应用本地算法并将结果输出。系统之间没有通信,我在这里缺少什么??这本书使用了不同的方法吗?如果是,那是什么方法,因为我已经读了同一个第三单元次了,但我仍然不明白(也许翻译不好,但不确定)。

提前感谢

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

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

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

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

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

id大胆猜测您的连接是本地客户端。因为它与所有机器都有连接。

最新更新