【Bitmap Index】B-Tree索引与Bitmap位图索引的锁代价比较研究

通过以下实验,来验证Bitmap位图索引较之普通的B-Tree索引锁的“高昂代价”。位图索引会带来“位图段级锁”,实际使用过程一定要充分了解不同索引带来的锁代价情况。

1.为比较区别,创建两种索引类型的测试表
1)在表t_bitmap上创建位图索引
[email protected]> create table t_bitmap (id number(10), name varchar2(10),sex varchar2(1));

Table created.

[email protected]> create bitmap index t_bitmap_idx on t_bitmap(sex);

Index created.

2)在表t_btree上创建普通B-Tree索引
[email protected]> create table t_btree (id number(10), name varchar2(10), sex varchar2(1));

Table created.

[email protected]> create index t_btree_idx on t_btree(sex);

Index created.

2.每张表中初始化两条数据:“一个男孩”和“一个女孩”
注释:
M - Male - 表示男孩;
F - Femail - 表示女孩。

1)初始化数据t_btree表数据
[email protected]> insert into t_btree values (1, ‘Secoooler‘, ‘M‘);

1 row created.

[email protected]> insert into t_btree values (2, ‘Anna‘,‘F‘);

1 row created.

2)初始化数据t_bitmap表数据
[email protected]> insert into t_bitmap values (1, ‘Secoooler‘, ‘M‘);

1 row created.

[email protected]> insert into t_bitmap values (2, ‘Anna‘,‘F‘);

1 row created.

[email protected]> commit;

Commit complete.

3)查看初始化之后的结果
(1)t_btree表中包含两条数据
[email protected]> select * from t_btree;

ID NAME       S
---------- ---------- -
         1 Secoooler  M
         2 Anna       F

(2)t_bitmap表中包含两条数据
[email protected]> select * from t_bitmap;

ID NAME       S
---------- ---------- -
         1 Secoooler  M
         2 Anna       F

3.在两个不同的session中,对具有普通B-Tree索引表t_btree演示插入、修改和删除“男孩”数据
第一个session中的插入后不要提交
[email protected]> insert into t_btree values (3, ‘Andy‘, ‘M‘);

1 row created.

第二个session中插入同样的状态数据,可以看到,插入、修改和删除均能够成功完成
[email protected]> insert into t_btree values (4, ‘Tutu‘, ‘M‘);

1 row created.

[email protected]> update t_btree set sex=‘M‘ where id=2;

1 row updated.

[email protected]> delete from t_btree;

2 rows deleted.

4.在两个不同的session中,对具有Bitmap位图索引表t_bitmap演示插入、修改和删除“男孩”数据
1)第一个session中的插入后不要提交
[email protected]> insert into t_bitmap values (3, ‘Andy‘, ‘M‘);

1 row created.

2)第二个session中对男孩数据进行处理,可以看到,只要操作信息中涉及到位图索引列的插入、修改和删除均无法完成!!
(1)插入测试
当插入数据涉及位图索引列“sex”字段时,是无法完成的。
[email protected]> insert into t_bitmap values (4, ‘Tutu‘, ‘M‘);
问题出现了:出现了“锁等待”停滞不动的现象!

当插入数据未涉及位图索引列“sex”字段时,是可以完成的。
[email protected]> insert into t_bitmap(id,name) values (4, ‘Tutu‘);

1 row created.

[email protected]> commit;

Commit complete.

(2)更新测试
此时第二个会话的测试数据内容如下。
[email protected]> select * from t_bitmap;

ID NAME       S
---------- ---------- -
         1 Secoooler  M
         2 Anna       F
         4 Tutu

当更新位图索引列“sex”字段值为“M”时,是无法完成的。
[email protected]> update t_bitmap set sex=‘M‘ where id=1;

1 row updated.

此时成功,是因为第一行数据的sex值本身就是“M”。

[email protected]> update t_bitmap set sex=‘M‘ where id=2;
问题出现了:出现了“锁等待”停滞不动的现象!

[email protected]> update t_bitmap set sex=‘M‘ where id=4;
问题出现了:出现了“锁等待”停滞不动的现象!

另外,特别注意一下,如果更新的列不是位图索引对应的列,将不会受位图段级索引锁的限制。如下所示。
[email protected]> update t_bitmap set name=‘Xu‘ where id=2;

1 row updated.

(3)删除测试
当删除的数据包含位图索引列“sex”字段值为“M”时,是无法完成的。
[email protected]> delete from t_bitmap where id=1;
问题出现了:出现了“锁等待”停滞不动的现象!
当删除表中的所有数据时,同样的道理,也是不能删除的。
[email protected]> delete from t_bitmap;
问题出现了:出现了“锁等待”停滞不动的现象!

5.小结
  本文以对数据本身冲击力最小的插入动作为例,演示了B-Tree和Bitmap索引的锁代价。对于B-Tree索引来说,插入动作不影响其他会话的DML操作;但是,对于Bitmap索引来说,由于是索引段级锁,会导致与操作列值相关的内容被锁定(文中提到的“M”信息)。进一步,对于更新动作来说,

产生上面现象的原因:
  位图索引被存储为压缩的索引值,其中包含了一个范围内的ROWID,因此ORACLE必须针对一个给定值锁定所有范围内的ROWID,不支持行级别的锁定。
  换一种描述方法:使用位图索引时,一个键指向多行(成百上千),如果更新一个位图索引键,会同时将其他行对应位图索引字段进行锁定!

较之B-Tree索引优点:
  位图以一种压缩格式存放,因此占用的磁盘空间比B-Tree索引要小得多

较之B-Tree索引缺点:
  这种锁定的代价很高,会导致一些DML语句出现“锁等待”,严重影响插入、更新和删除的效率,对于高并发的系统不适用。

位图索引使用原则:
  位图索引主要用于决策支持系统或静态数据,不支持索引行级锁定。
  位图索引最好用于低cardinality列(即列的唯一值除以行数为一个很小的值,接近零),例如上面的“性别”列,列值有“M”,“F”两种。在这个基本原则的基础上,要认真考虑包含位图索引的表的操作特点,如果是并发操作高的系统,不适合使用位图索引!

转:http://blog.itpub.net/519536/viewspace-611296/

时间: 2024-08-11 07:32:01

【Bitmap Index】B-Tree索引与Bitmap位图索引的锁代价比较研究的相关文章

Oracle索引总结(四)- Oracle索引种类之位图索引

位图索引 1.1 位图索引概述 位图索引通过位图向量,表示索引键值在表中的分布. 适用于没有大量更新操作的对象,如:OLAP数据库. 对于存在大量更新操作的索引列,不适用位图索引.因此对于OLTP并不适用. 更新位图向量时,相应位图涉及的所有数据行会被锁定,无法针对这些数据行的该索引列进行DML操作. 1.2 位图索引结构的说明 与B-tree索引的联系及区别如下: 与B-tree索引的联系:位图索引使用B-tree形式组成. 与B-tree索引的区别:位图索引的一个索引键值对应一个叶子节点.(

位图索引(Bitmap Index)——索引共用

位图索引区别于传统B*树索引有两个结构特点:其一是叶子节点上是一个可能的索引列取值对应一个叶子节点.另一个就是叶子节点上通过一个位图向量表示对应行是否取定这个索引值. 使用位图向量记录对应行的取值情况不仅可以带来存储空间上的节省,而且可以借助计算机位图运算的快速特性来提高索引结果利用率.下面我们通过模拟情况来进行分析. Bitmap Index模拟说明 假设存在数据表T,有两个数据列A和B,取值如下. 序号 A B 1 L 1 2 T 2 3 L 2 4 M 1 对两个数据列A.B分别建立位图索

Oracle中关于bitmap index的使用问题

您如果熟悉 Oracle 数据库,我想您对 Thomas Kyte 的大名一定不会陌生. Tomas 主持的 asktom.oracle.com 网站享誉 Oracle 界数十年,绝非幸致.最近在图书馆借到这位 Oracle 绝顶高手编著的< Expert Oracle Database Architecture-9i and 10g programming Techniques and Solutions >,翻阅之下,果然盛名无虚,虽然说不上字字珠玑,但作者对 Oracle 架构的理解和实

oracle位图索引

以下内容主要都是关于oracle 10g位图索引,重点是存储,其它优缺点,查询机制等也略微介绍,概因为存储机制是根基.内容主要分四个部分:1)来源于http://blog.chinaunix.net/uid-20687159-id-1894992.html2)来源于http://blog.sina.com.cn/s/blog_4c6fef63010085m8.html3)来自oracle官方文档的和其它一些.  4)个人的试验,看位图索引的情况.-------------------------

数据库使用-oracle位图索引

我们目前大量使用的索引一般主要是B*Tree索引,在索引结构中存储着键值和键值的RowID,并且是一一对应的.而位图索引主要针对大量相同值的列而创建(例如:类别,操作员,部门ID,库房ID等),索引块的一个索引行中存储键值和起止Rowid,以及这些键值的位置编码,位置编码中的每一位表示键值对应的数据行的有无.一个块可能指向的是几十甚至成百上千行数据的位置.这种方式存储数据,相对于B*Tree索引,占用的空间非常小,创建和使用非常快. 位图索引的目标是为用户提供指向包含特定键值(key value

[转帖]B树索引、位图索引和散列索引

B树索引.位图索引和散列索引 https://blog.csdn.net/huashanlunjian/article/details/84460436 索引在数据结构上可以分为三种B树索引.位图索引和散列索引 B树索引 结构: 特点: 1.索引不存储null值. 更准确的说,单列索引不存储null值,复合索引不存储全为null的值 索引不能存储Null,所以对这列采用is null条件时,因为索引上根本没Null值,不能利用到索引,只 能全表扫描. 为什么索引列不能存Null值呢?将索引列值进

索引——位图索引

位图索引非常适合于决策支持系统(Decision Support System,DSS)和数据仓库,它们不应该用于通过事务处理应用程序访问的表.它们可以使用较少到中等基数(不同值的数量)的列访问非常大的表.尽管位图索引最多可达30个列,但通常它们都只用于少量的列. 例如,您的表可能包含一个称为Sex的列,它有两个可能值:男和女.这个基数只为2,如果用户频繁地根据Sex列的值查询该表,这就是位图索引的基列.当一个表内包含了多个位图索引时,您可以体会到位图索引的真正威力.如果有多个可用的位图索引,O

于位图索引相关的执行计划

位图索引是oracle数据库里除B树索引之外的另外一种索引的类型,它主要用于数据仓库或者DSS系统.在数据仓库或DSS系统中,针对某些类型的sql,用位图索引比用B树索引要快很多,这主要是位图索引实现了快捷的按位运算的缘故. 位图索引的物理存储结构和普通B树索引的物理存储结构相似,也是按照被索引的键值列有序存储,只不过和索引键值一起存储的不再仅仅是索引键值所对应的rowid,而是变成了三部分的组合.这三部分分别为对应rowid的下限,对应rowid的上限和被压缩存储的位图(Bitmap Segm

Oracle 位图索引

内容简介: 1.位图索引 1.1位图索引使用注意事项; 1.2 使用位图索引; 1.3 位图索引对DML操作的影响; 2.位图连接索引 2.1 明确需求后使用位图索引; 2.1创建位图连接索引的注意事项: 1.位图索引: 1.1位图索引使用注意事项: ? 一般适用于低基数列; ? 适合数据仓库; ? 对于启用位图索引的表,应尽量减少或避免DML操作; ? 如果对一张含有多列位图索引的表进行大量DML操作,应考虑将位图索引删除,DML操作结束后重建位图索引; ? 不适用于频繁持续发生DML操作的O