日期:2014-05-16  浏览次数:20672 次

oracle B-Tree和Bitmap索引对比详解

http://space.itpub.net/?uid-13062352-action-viewspace-itemid-614553

?

oracle B-Tree和Bitmap索引对比详解

B树索引是所有大型关系数据库毕用的技术,也是oracle数据库默认的索引技术。
基数:指的是你要创建索引的列中所包含的不同键值的数量。例如我们的列是性别,那么它的键值就是男、女所以你的索引基数是2.
oracle中每个表的行都有一个rowid,用于标记这个行在数据库中的位置。

关于索引:
B-TREE索引,结构如下:
?????????????? root
?????????????? / | \
? branch1 ........
???? /|\ ......................
leaf1......

leaf节点的结构是这样的:
?? |索引头|列长度|列内容|rowid(s)|

一个叶子节点的大小大概是8192*8bit,因此一个字段的长度即使是50,那么一个节点大概能分成100个子节点,那么100万的记录,也只需要3级节点即可索引完毕,因此一般b-tree的深度不超过4级,这样根据b-tree来查找一条记录,最多只需遍历4个节点找到rowid,再根据rowid查找磁盘即可得到最终记录数据。


对某列查询的结果集记录数如果通常都小于7%,则应该在该列添加索引。对b-tree来说,where xx is null条件是不会利用索引的,因此建议这种列应该设置默认值,以避免该列的值存在null的情况,同样group by 中如果该列有null索引也可能无效。

bitmap索引:
bitmap索引的结构也是树形结构,但是叶子节点的结构与b-tree不一样。bitmap叶子节点的结果大概如下:
<key1 start-rowid? end-rowid? bitmap>
<key2 start-rowid? end-rowid? bitmap>
......
其中bitmap的内容是110010100011100001这样的01组合形式,它的长度与start-rowid和end-rowid之间包含的rowid数量一致。这样假设范围内第9个rowid对应列的内容是key1,那么kei1对应的bitmap中第9个字符的值就是1,否则就是0。同样每个块的大小是8192*8,那么一个bitmap索引的叶子节点大概能索引10000条记录。
bitmap索引对null的字段依然有效,具体null的值在bitmap中是取0还是专门有个keyX的值是null来区分需要再查证。bitmap索引对or条件的查询效果非常好,它不适应与索引列的值经常变化的情况,如果索引列的值经常变化,那么对bitmap索引将是灾难性的,因为它要锁定所有相关的叶子节点所在的块来更新bitmap的值,它适用于决策支持系统。