Oracle应当增加一种基于Hash算法的索引

    Hash是非常高效的一种查找算法, Oracle中的Hash Join更是声名远播, 还有Hash Cluster表, 可以获得很好的性能. 现在的B*Tree结构的索引, 虽然很好, 但在很繁忙的系统中, 还是有一些不足, 比较典型的是在索引的根结点上, 发生Split时很容易引起数据库的问题. 另外从Root块到Branch块, 再到Leaf块, 最后到获得表的记录, 需要访问比较多的结点.

    既然Hash算法能用于表, 那么也能用于索引. 因为索引从另外一个角度来说, 也象一个表, 象一个包括了索引列加上ROWID组成的表. 通过这种Hash类型的索引, 第一个可以将读一条记录的Gets减少到2, 同时也没有了Root块和Branch块的Split问题, 实在是值得考虑的一种新的索引类型.

    其实通过Context接口, 已经可以很容易地实现这样的功能, 谁有写过自定义的Context索引类型?

    在Oracle中Hash Cluster不一定要求字段是数字类型的, 因此支持Hash Index并不需要改动很多吧? 如下所示:

SQL> create cluster c_hashidx (col1 varchar2(30)) hashkeys 128;

Cluster created.

    不知道现在的哪种数据库中已经有这种类型的索引了? 听说在IBM DB2中, 创建索引时可以指定一些包含(Including)的列, 这些列的值会在索引中存放, 以进行行过滤, 但这些字段并不参于索引中记录的排序, 这个功能要是能在Oracle中有就好了!

留言 (3)

hash 的桶的大小不好确定。如果不合适,hash冲突多了,效率更低。 hash cluster 灵活性本来就不够的。

我希望有Hash Index, 其实是想它的Online Rebuild功能, 桶的大小其实比较好确定, 不过肯定会浪费一些存贮.

10.2 支持 普通表 online rebuild 到 Single Hash Cluster table.

IOT 支持附属列,就用于查询,而不参加排序,
可惜只有一个主键索引.

发表留言:

« Previous | Main | Next »

英语900句 | English 900

  • Witch pleasure.
  • 很高兴.
  • I'm sorry. I'm engaged now.
  • 对不起, 我现在正忙着.
  • I'm glad to, but I'm afraid I don't have the time.
  • 我很乐意, 但我恐怕没时间.
  • Would you mind closing the window for me?
  • 能帮我关一下窗户吗? (你介意关下窗户吗? )
  • Not at all.
  • 当然可以. (当然不介意)