ITPub博客

首页 > 数据库 > Oracle > B-tree和bitmap

B-tree和bitmap

Oracle 作者:sunyi_672 时间:2015-01-02 17:17:20 0 删除 编辑

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叶子节点的结果大概如下: 
 
 
...... 
其中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的值,它适用于决策支持系统。




转载地址:http://www.linuxidc.com/Linux/2012-03/57460.htm

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26600495/viewspace-1387649/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: oracle sql调优
请登录后发表评论 登录
全部评论

注册时间:2014-12-29

  • 博文量
    51
  • 访问量
    62994