Database 通过哈希划分数据库关系

Database 通过哈希划分数据库关系,database,memory-management,database-design,hash,Database,Memory Management,Database Design,Hash,从教科书“数据库系统实现,2000 Garcia Molina and al.”中,第6.6.1节通过哈希划分关系描述了将关系R划分为M-1个存储桶的以下算法,其中M是内存缓冲区的大小(假设一个块的大小等于一个内存缓冲区的大小): 我很想知道在这种情况下,我们所说的桶是什么意思,以及它的结构是什么样的(一个草图会更受欢迎)? 据我目前所知,bucket是一个内存缓冲区,其中包含散列键(即h(t))+值(即t)。然而,由于密钥H(t)提供的额外信息,我们不应该考虑一个适合于一个元组块的内存缓冲区也

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

我很想知道在这种情况下,我们所说的桶是什么意思,以及它的结构是什么样的(一个草图会更受欢迎)?
据我目前所知,bucket是一个内存缓冲区,其中包含散列键(即h(t))+值(即t)。然而,由于密钥H(t)提供的额外信息,我们不应该考虑一个适合于一个元组块的内存缓冲区也适合于这个块的一个桶。是这样吗?

一般来说,当谈到散列算法时,bucket是一个“位置”,根据散列函数放置元素。因此,bucket由哈希函数返回的唯一整数(地址)唯一确定

在书中指定的算法中,M是使用的bucket数(例如,M是质数,哈希函数只是密钥除以M的余数,在本例中是整个元组),缓冲区用作中间内存来保存每个bucket的页面

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

左圆柱体是输入文件,分为元组的页面(块)。中心矩形表示将块的所有元组散列的过程,方法是将它们写入一个主内存缓冲区(该缓冲区已满时,将写入输出,即右圆柱体,并写入相应的bucket)。从图中可以清楚地看出,在此上下文中什么是bucket:是一组页面(块),因此可以将其视为一个文件。请记住,该算法仅描述两次过程的第一次过程:分发过程。第二次遍历将读取主内存中每个bucket的所有页面,并使用本书上一节描述的算法(例如,使用第二个哈希函数)扫描这些页面以消除重复

最后请注意,主要的假设是只有两个过程足以处理整个初始文件。实际上,当主内存中的缓冲区数量足够大时,通常会出现这种情况(大约有100个缓冲区,算法可以处理数百万个元组)

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;