Ch10 hash-based indexing(笔记)

笔记:

1、静态哈希:与ISAM一样存在长溢出链的问题
不支持范围搜索
主要问题:桶数量固定
解决:周期性地重哈希(花费时间,重哈希时索引不能被使用)、动态哈希
2、可扩展哈希 
插入新的数据条目时,重新整理文件
使用指向存储桶的指针目录,并通过仅将目录加倍并仅拆分溢出的存储桶来使存储桶数量增加一倍
3、线性哈希
不需要目录,可以自然地处理冲突
但如果数据分布不均,则溢出链可能会导致线性哈希性能比可扩展哈希性能差

Review:

·基于哈希的索引旨在用于等值查询。 哈希函数应用于搜索字段值,并返回存储区编号。 桶号对应于磁盘上包含所有可能相关记录的页面。 静态哈希索引具有固定数量的主存储桶。 在插入期间,如果用于数据输入的主存储桶已满,则会分配一个溢出页面并将其链接到主存储桶。 桶中的溢出页面列表称为其溢出链。 在没有溢出链的情况下,静态哈希可以通过单个磁盘I / O来回答相等性查询。 但是,随着文件的增长,静态哈希会受到较长的溢出链的影响,并且性能会下降。 (第10.1节)
·可扩展哈希是一种动态索引结构,它通过以目录形式引入间接级别来扩展静态哈希。 通常,目录的大小为2^d,这称为索引的全局深度。 通过查看哈希函数结果的前d位,可以找到正确的目录条目。 目录条目指向磁盘上包含实际数据条目的页面。 如果页面已满,并且有新的数据条目落入该页面,则根据哈希值的前l位重新分配整个页面中的数据条目。 值l称为页面的局部深度。 如果数据分布不正确,目录可能会变大。 冲突是具有相同哈希值的数据条目,必须特别处理。 (第10.2节)
·“线性哈希”通过以循环方式拆分存储桶来避免目录。线性散列处理是逐轮进行的。在每个回合开始时,都有一组初始的桶。插入会触发存储桶拆分,但是存储桶将按顺序顺序拆分。需要溢出页面,但是溢出链不太可能很长,因为每个存储桶将在某个时刻被拆分。在每个回合中,使用两个哈希函数h(Level)和h(Level + 1),其中h(Level)用于查找尚未拆分的存储桶,而h(Level + 1)用于查找已拆分的存储桶。当所有初始存储桶均拆分后,当前轮结束,下一轮开始。 (第10.3节)
·可扩展和线性散列密切相关。线性散列通过具有预定义的存储桶顺序来避免目录结构。线性散列相对于可扩展散列的缺点是空间利用率可能较低,尤其是对于偏斜的分布,这是因为存储区拆分不像可扩展散列中那样集中在数据密度最高的位置。基于目录的线性散列实现可以提高空间占用率,但是在极端情况下,它仍然可能不如可扩展散列。 (第10.4节)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章