哈希分区数据库关系

时间:2017-12-09 16:54:39

标签: database memory-management database-design hash

从教科书“数据库系统实现,2000 Garcia-Molina等人”中,第6.6.1节“通过散列分区关系”描述了以下用于将关系R划分为M-1个桶的算法,其中M是主要内存缓冲区的大小(假设一个块大小等于一个主内存缓冲区):

initialize M-l buckets using M-l empty buffers;
FOR each block b of relation R DO BEGIN
     read block b into the Mth buffer;
     FOR each tuple t in b DO BEGIN
              IF the buffer for bucket h(t) has no room for t THEN
                  BEGIN
                      copy the buffer to disk;
                      initialize a new empty block in that buffer;
                  END;
             END; 
             copy t to the buffer for bucket h(t);
     END;
END;
FOR each bucket DO
     IF the buffer for this bucket is not empty THEN
          write the buffer to disk;
     END;
END;

我很想知道在这种情况下我们的意思是什么,以及它的结构如何(草图将不仅仅是赞赏)? 根据我到目前为止所理解的,桶是一个包含散列密钥(即h(t))+值(即t)的存储缓冲器。但是,由于密钥h(t)提供的额外信息,我们不应该考虑一个适合一个元组块的内存缓冲区也适合相对于该块的一个桶。是吗?

1 个答案:

答案 0 :(得分:1)

通常,在讨论散列算法时,存储桶是根据散列函数放置元素的“位置”。因此,存储桶由散列函数返回的唯一整数(地址)唯一确定。

在本书指定的算法中,M是使用的桶数(例如,M是素数,散列函数只是除以M的除以M的余数,在这种情况下是整个元组),缓冲区用作中间内存来保存每个桶的页面。

在下图中(使用B而不是M-1),您可以看到算法中描述的过程:

enter image description here

左侧柱面是输入文件,分为元组的页面(块)。中心矩形表示对块的所有元组进行散列的过程,方法是将它们写入一个主内存缓冲区(当满的时候,将其写入输出,右侧柱面,写入相应的桶)。从图中可以看出,在这种情况下,什么是存储桶:是一组页面(块),因此可以将其视为文件。请记住,该算法仅描述了两次传递过程的第一次传递:分布传递。对于每个存储桶,第二遍将读取主存储器中的所有页面,并将使用本书前一部分中描述的算法扫描它们以消除重复(例如,使用第二个散列函数)。 / p>

最后请注意,主要假设是只有两遍足以处理整个初始文件。实际上,通常情况下主存储器中的缓冲区数量足够高(类似于100个缓冲区,算法可以处理数百万个元组)。