oracle 位图索引 B-树索引

转载 2012年03月26日 21:54:45
B-树索引在Oracle中是一个通用的索引,在创建索引时它就是默认的索引类型。最多可以包括32列。
位图索引Oracle为每个唯一键创建一个位图,然后把与键值所关联的ROWID保存为位图。最多可以包括30列。
一般情况下,大多数用户都只创建TYPE为NORMAL的B-树索引,所以对于较低基数的列我们都是不创建索引的,因为B-树索引对查询速度提升不一定会有改善,甚至会增加Insert、Update、Delete命令所消耗的时间。下面我们通过一个例子来比较B-树索引与位图索引在对查询速度提升的效果。
SQL>--例如下面一个测试表有534888条记录
SQL> select count(*) from henry_test;
COUNT(*)
----------
534888
SQL> --没有索引的情况(耗时1.631秒)
SQL> select count(*) from henry_test where payment_method<'91';
COUNT(*)
----------
371466
SQL> --建立B-树索引
SQL> create index idx_henry_test1 on henry_test(payment_method);
Index created
SQL> --使用提示强制使用索引
SQL> select /*+ index(henry_test IDX_HENRY_TEST1)*/count(*) from henry_test where payment_method<'91';
COUNT(*)
----------
371466
SQL>--(耗时0.181秒)
SQL> --删除索引
SQL> drop index IDX_HENRY_TEST1;
Index dropped
SQL> --因为payment_method这个列的基数非常的低,只有5种值,所以非常适合使用位图索引
SQL> --建立位图索引
SQL> create bitmap index IDX_HENRY_TEST1 on HENRY_TEST (PAYMENT_METHOD);
Index created
SQL> --使用提示强制使用索引
SQL> select /*+ index(henry_test IDX_HENRY_TEST1)*/count(*) from henry_test where payment_method<'91';
COUNT(*)
----------
371466
SQL>--(耗时0. 01秒)
SQL> --删除索引
SQL> drop index IDX_HENRY_TEST1;
Index dropped
大家可以看到位图索引比B-树索引的速度提高了十多倍。
下面2段文字是我直接从书上抄的,见笑了。
位图索引在加载表(插入操作)时通常要比B-树索引做得好。通常,位图索引要比一个低基数(很少不同值)上的B-树索引要快3~4倍,但如果新增的值占插入行的70%以上时,B-树索引通常会更快一些。当每条记录都增加一个新值时,B-树索引要比位图索引快3倍。
建议不要在一些联机事务处理(OLTP)应用程序中使用位图索引。B-树索引的索引值中包含ROWID,这样Oracle就可以在行级别上锁定索引。位图索引被存储为压缩的索引值,其中包含了一个范围内的ROWID,因此ORACLE必须针对一个给定值锁定所有范围内的ROWID。这种锁定可能自阿某些DML语句中造成死锁。SELECT语句不会受到这种锁定问题的影响。
位图索引有很多限制:
1、基于规则的优化器不会考虑位图索引
2、当执行ATLER TABLE语句,并修改包含有位图索引的列时,会使位图索引实效
3、位图索引在索引块中储存了索引键的值;然而,他们并不能用户任何类型的完整性检查
4、位图索引不能被申明为唯一索引

B-树索引与位图索引的比较

---------------------------------------------------------------------- B-树(B-tree)索引               ...
  • woqiang68
  • woqiang68
  • 2013年07月15日 15:15
  • 979

B树索引和位图索引的区别!

B树索引 主键和唯一性约束字段的B树索引,效率几乎和海量数据没有关系。 键值重复率低的字段比较适合使用B树索引。 位图索引 键值重复率高的字段比较适合使用位图索引。 count、an...
  • zq9017197
  • zq9017197
  • 2011年11月24日 17:07
  • 4520

[Oracle]深入研究B-树索引

摘要:本文对B树索引的结构、内部管理等方面做了一个全面的介绍。同时深入探讨了一些与B树索引有关的广为流传的说法,比如删除记录对索引的影响,定期重建索引能解决许多性能问题等。 1.B树索引的相关概念  ...
  • xiaoxu0123
  • xiaoxu0123
  • 2010年04月05日 14:56
  • 7613

B树索引、位图索引和散列索引

索引在数据结构上可以分为三种B树索引、位图索引和散列索引   B树索引   结构:           特点:   1.索引不存储null值。      更...
  • zhangyi880405
  • zhangyi880405
  • 2014年10月03日 16:57
  • 873

[Oracle]B-树索引与位图索引

11.3 B-树索引索引的顶端是根结点,这一结点中包含的是存有指向索引中下一级指针的项。接下来是分枝结点(块),分枝结点中的记录(项)存的是指向下一级(块)的指针。最底层为叶子结点。在叶子结点存有指向...
  • xiaoxu0123
  • xiaoxu0123
  • 2010年04月05日 16:08
  • 2609

Oracle位图索引引发的阻塞与死锁

前面我介绍了itl引发的阻塞与死锁,这里有必要再介绍一下位图索引引发的阻塞与死锁,因为这个也是不同于普通死锁的一种死锁方式,在有位图索引存在的表上面,其实很容易就引发阻塞与死锁。这个阻塞不是发生在表上...
  • isourire
  • isourire
  • 2016年09月18日 16:27
  • 841

Oracle关于位图索引的创建与应用

1)创建   CREATE BITMAP INDEX index_name ON normal_index_creation_clause;   Oracle创建一系列的位图,每个位图都与...
  • yxl626571494
  • yxl626571494
  • 2016年03月13日 10:55
  • 3576

B-树索引与位图索引

/*刚从书上看到了位图索引,自己经过了测试,于是现学现卖,希望对还不了解的人有所帮助*/ B-树索引在Oracle中是一个通用的索引,在创建索引时它就是默认的索引类型。最多可以包括32列。 位图索引O...
  • heyixiang
  • heyixiang
  • 2005年09月16日 16:10
  • 5992

《Oracle SQL优化基础》之位图索引(BitMap index)

有不少做BI的后台同事问我,位图索引是啥?啥时候用? 此篇仅作为一个扫盲篇,有不对的地方欢迎大神指正。 首先我们要搞明白位图索引是什么,与普通的B*树索引有什么区别呢? 顾名思义,首先他是个索引(...
  • doupeihua
  • doupeihua
  • 2016年08月13日 19:25
  • 2435

详解oracle bitmap位图索引

位图索引是oracle中非常重要的一种索引形式。本文通过总结有关位图索引的资料,尝试回答如下几个问题: 1:什么是位图索引? 2:位图索引适合什么场景,不适合什么场景? 3:位图索引的性能如何?...
  • joeadai
  • joeadai
  • 2013年11月24日 21:14
  • 5780
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:oracle 位图索引 B-树索引
举报原因:
原因补充:

(最多只允许输入30个字)