��1、用索引还是散列?
��在实际的数据库系统设计中,到底是用索引还是散列要充分考虑以下几个问题:
��⑴�索引或散列的周期性重组代价如何?
��⑵�在文件中插入和删除记录的频率如何?
��⑶�为了优化平均访问时间而导致最坏情况下的访问时间的做法是否可取?
��⑷�能够有效支持的查询类型是哪些?
��2、对查询类型的支持
��⑴�我们先看一个散列适合的查询:select A1,
A2, … , An from r
where Ai = c对于这个查询来说:
��①�顺序索引查找所需要的时间与关系r中Ai值的个数的对数成正比;但在散列结构中,平均查找时间是一个与数据库大小无关的常数,因此这是一个适合用散列的查询;
��②�使用索引时,最坏情况下的查找时间和关系r中Ai值的个数的对数成正比;而散列在最坏情况下可能需要搜索所有记录(散列函数将所有的搜索码值都映射到同一个存储桶中),但这种情况发生的可能性极小。
��⑵�我们再来看一个索引适合的查询:
select A1, A2, … ,
An from r where Ai
>= c1 AND Ai <= c2对于这个查询来说:
�①�使用索引时,首先查找值c1所在的块或桶,然后顺着索引中的指针链(顺序索引中的搜索码链表或B+树索引中的叶结点的Pn指针链)继续查找,直到查找到值c2为止;
�②�如果使用散列,由于散列函数的随机性,将不得不读取所有的存储桶。因此这是一个适合用索引的查询。
��
|