Hash帮助优化query time:如果query拥有相同的value,通过hash函数快速定位到相同的page。
在hash时,有时候不同值落在了同一个点,这就是hash collision problem(哈希冲突),但时每个bucket都有很多空间,所以不用担心这个问题。
ka是一个words的数组,它的起始与byte stream 的起始一样,如果K不能被4整除,会产生alignment error。所以我们假设K起始于一个4byte的边界,然后视ka为一个4bytes的数组,即无符号整数。(即把ka这个bytes address看作一个uints的数组)。
ka+=3是指越过3个4bytes,即12。
两种衡量Hash的方法:
(1)L指有多少available的capacity可用(load factor)。
r是tuples的总数。
b是pages的总数。
c是每个page能容纳tuples的数。
bc是data file能容纳多少tuples。
当L接近于1时非常好。
(2)让overflow page越少越好。
平均overflow chain的长度:Ov=b(ov)/b
最好情况: hash file满了且没有overflow pages。
最坏情况:hash value等于0。与Heap file一样。
平均情况:0.75<=load factor L<=0.9, 0<Ov<1
Hashing的Selection
通过hash找到对应的Page,如果在page里就返回tuple,不在就搜索它的overflow pages,如果有则返回tuple。
如果没有找到则返回null。
最好的情况:直接在hash返回的page上找到tuple。所以是1.
平均情况:在hash返回的page上没找到,再寻找一半的overflow pages找到tuple。所以是1+Ov/2。
最坏情况:page上有最长的的overflow chain。
通过Hash function得到Page:
Select 不唯一的keys(pmr):
所有相同的都存在于一个bucket中。
找到hash对应的page,搜索它的overflow page。
如果Ov很小,则是一个很好的cost。
Select with hashing in range queries
Hash对range queries无效,大部分的Hash function不能保留顺序。除非attribute是离散的且hash function确保tuple根据hash key的顺序在data file中存储,比如要查询年龄20~30,则run query 20,21,…30。