0

我目前正在阅读一本关于 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

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

提前致谢

4

2 回答 2

0

我猜测您的连接是您的本地客户端。因为它连接到所有机器。

于 2012-09-13T00:29:03.427 回答
0

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

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

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

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

关键思想是,相同的处理器在无共享环境中存储数据作为处理。

于 2012-09-13T00:44:17.240 回答