博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Bitmap Index】B-Tree索引与Bitmap位图索引的锁代价比较研究
阅读量:5832 次
发布时间:2019-06-18

本文共 3447 字,大约阅读时间需要 11 分钟。

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

1.为比较区别,创建两种索引类型的测试表
1)在表t_bitmap上创建位图索引
SEC@ora11g> create table t_bitmap (id number(10), name varchar2(10),sex varchar2(1));
Table created.
SEC@ora11g> create bitmap index t_bitmap_idx on t_bitmap(sex);
Index created.
2)在表t_btree上创建普通B-Tree索引
SEC@ora11g> create table t_btree (id number(10), name varchar2(10), sex varchar2(1));
Table created.
SEC@ora11g> create index t_btree_idx on t_btree(sex);
Index created.
2.每张表中初始化两条数据:“一个男孩”和“一个女孩”
注释:
M - Male - 表示男孩;
F - Femail - 表示女孩。
1)初始化数据t_btree表数据
SEC@ora11g> insert into t_btree values (1, 'Secoooler', 'M');
1 row created.
SEC@ora11g> insert into t_btree values (2, 'Anna','F');
1 row created.
2)初始化数据t_bitmap表数据
SEC@ora11g> insert into t_bitmap values (1, 'Secoooler', 'M');
1 row created.
SEC@ora11g> insert into t_bitmap values (2, 'Anna','F');
1 row created.
SEC@ora11g> commit;
Commit complete.
3)查看初始化之后的结果
(1)t_btree表中包含两条数据
SEC@ora11g> select * from t_btree;
        ID NAME       S
---------- ---------- -
         1 Secoooler  M
         2 Anna       F
(2)t_bitmap表中包含两条数据
SEC@ora11g> select * from t_bitmap;
        ID NAME       S
---------- ---------- -
         1 Secoooler  M
         2 Anna       F
3.在两个不同的session中,对具有普通B-Tree索引表t_btree演示插入、修改和删除“男孩”数据
第一个session中的插入后不要提交
SEC@ora11g> insert into t_btree values (3, 'Andy', 'M');
1 row created.
第二个session中插入同样的状态数据,可以看到,插入、修改和删除均能够成功完成
SEC@ora11g> insert into t_btree values (4, 'Tutu', 'M');
1 row created.
SEC@ora11g> update t_btree set sex='M' where id=2;
1 row updated.
SEC@ora11g> delete from t_btree;
2 rows deleted.
4.在两个不同的session中,对具有Bitmap位图索引表t_bitmap演示插入、修改和删除“男孩”数据
1)第一个session中的插入后不要提交
SEC@ora11g> insert into t_bitmap values (3, 'Andy', 'M');
1 row created.
2)第二个session中对男孩数据进行处理,可以看到,只要操作信息中涉及到位图索引列的插入、修改和删除均无法完成!!
(1)插入测试
当插入数据涉及位图索引列“sex”字段时,是无法完成的。
SEC@ora11g> insert into t_bitmap values (4, 'Tutu', 'M');
问题出现了:出现了“锁等待”停滞不动的现象!
当插入数据未涉及位图索引列“sex”字段时,是可以完成的。
SEC@ora11g> insert into t_bitmap(id,name) values (4, 'Tutu');
1 row created.
SEC@ora11g> commit;
Commit complete.
(2)更新测试
此时第二个会话的测试数据内容如下。
SEC@ora11g> select * from t_bitmap;
        ID NAME       S
---------- ---------- -
         1 Secoooler  M
         2 Anna       F
         4 Tutu
当更新位图索引列“sex”字段值为“M”时,是无法完成的。
SEC@ora11g> update t_bitmap set sex='M' where id=1;
1 row updated.
此时成功,是因为第一行数据的sex值本身就是“M”。
SEC@ora11g> update t_bitmap set sex='M' where id=2;
问题出现了:出现了“锁等待”停滞不动的现象!
SEC@ora11g> update t_bitmap set sex='M' where id=4;
问题出现了:出现了“锁等待”停滞不动的现象!
另外,特别注意一下,如果更新的列不是位图索引对应的列,将不会受位图段级索引锁的限制。如下所示。
SEC@ora11g> update t_bitmap set name='Xu' where id=2;
1 row updated.
(3)删除测试
当删除的数据包含位图索引列“sex”字段值为“M”时,是无法完成的。
SEC@ora11g> delete from t_bitmap where id=1;
问题出现了:出现了“锁等待”停滞不动的现象!
当删除表中的所有数据时,同样的道理,也是不能删除的。
SEC@ora11g> 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/

本文转自 张冲andy 博客园博客,原文链接: http://www.cnblogs.com/andy6/p/5766934.html  ,如需转载请自行联系原作者

你可能感兴趣的文章
网站文章如何能自动判定是抄袭?一种算法和实践架构剖析
查看>>
【OpenCV学习】滚动条
查看>>
ofo用科技引领行业进入4.0时代 用户粘性连续8个月远甩摩拜
查看>>
兰州青年志愿者“中西合璧”玩快闪 温暖旅客回家路
查看>>
计划10年建10万廉价屋 新西兰政府:比想象中难
查看>>
甘肃发首版《3D打印职业教育教材》:校企合作育专才
查看>>
李娜入选国际网球名人堂 成亚洲第一人
查看>>
为找好心人抚养孩子 浙江一离婚父亲将幼童丢弃公园
查看>>
晚婚晚育 近20年巴西35岁以上孕妇增加65%
查看>>
读书:为了那个美妙的咔哒声
查看>>
深入探究Immutable.js的实现机制(一)
查看>>
jsp改造之sitemesh注意事项
查看>>
智能硬件的时代,嵌入式是否已经日薄西山
查看>>
SpringBoot-Shiro使用
查看>>
iOS 9.0之后NSString encode方法替换
查看>>
解决 ThinkPHP5 无法接收 客户端 Post 传递的 Json 参数
查看>>
ASMFD (ASM Filter Driver) Support on OS Platforms (Certification Matrix). (文档 ID 2034681.1)
查看>>
CRM Transaction处理中的权限控制
查看>>
[转]linux创建链接文件的两种方法
查看>>
python ipaddress模块使用
查看>>