我目前正在阅读一本关于 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 次,但我仍然不明白(也许翻译不好,但不确定)。
提前致谢