通过以下实验,来验证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/

转载于:https://www.cnblogs.com/andy6/p/5766934.html

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

  1. oracle索引图解,oracle 位图索引详解

    一.什么是位图索引 我们目前大量使用的索引一般主要是B*Tree索引,在索引结构中存储着键值和键值的RowID,并且是一一对应的. 而位图索引主要针对大量相同值的列而创建(例如:类别,操作员,部门ID ...

  2. 【索引分类】位图索引

    位图索引 位图索引非常适合于决策支持系统(Decision Support System,DSS)和数据仓库,它们不应该用于通过事务处理应用程序访问的表.它们可以使用较少到中等基数(不同值的数量)的列 ...

  3. Oracle索引梳理系列(四)- Oracle索引种类之位图索引

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...

  4. oracle 位图索引 死锁,Oracle位图索引引发的阻塞与死锁

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

  5. 位图索引(bitmap index)冲突引起的TX锁争用

    B*Tree索引的叶节点以排序形式存储索引条目,每个索引条目指向各自的一个rowid.所以唯一键冲突之外,索引条目之间不发生争用.而位图索引的叶节点具有 "column值+start row ...

  6. mysql bitmap index_位图索引:原理(BitMap index)

    位图(BitMap)索引 前段时间听同事分享,偶尔讲起Oracle数据库的位图索引,顿时大感兴趣.说来惭愧,在这之前对位图索引一无所知,因此趁此机会写篇博文介绍下位图索引. 1. 案例 有张表名为ta ...

  7. mysql bitmap位图索引_Oracle位图索引(Bitmap Index)

    欢迎进入Oracle社区论坛,与200万技术人员互动交流 >>进入 位图(bitmap)索引是另外一种索引类型,它的组织形式与B树索引相同,也是一棵平衡树.与B树索引的区别在于叶子节点里存 ...

  8. 浅析位图索引(bitmap index)

    位图索引基本概念 位图索引是一种很高效的索引结构,对于多属性过滤的聚合查询很高效,玩的就是 bit. 位图:位(bit)的一个简单数组,比如 001010,这个位数就是 6. 位图索引:假如建立在一个 ...

  9. 位图索引bitmap(一):基本概念

    1 基本概念 位图索引(bitmap index)技术是一类特殊的数据库索引技术,其索引使用bit数组(或称bitmap.bit set.bit string.bit vector)进行存储与计算操作 ...

最新文章

  1. 自己总结的安装zabbix
  2. MATLAB 未找到支持的编译器或 SDK。您可以安装免费提供的 MinGW-w64 C/C++ 编译器
  3. Linux SWAP 交换分区
  4. javascript基础系列:字符串的常用方法
  5. 关于Maven项目build时出现No compiler is provided in this environment的处理
  6. 中国甜叶菊乳制品市场趋势报告、技术动态创新及市场预测
  7. 逸管家中小企业未来的发展不可忽视人才战略
  8. pandas 入门(详看注释)
  9. 小波分解和小波包分解
  10. 企业IP地址怎么划分
  11. 蓝墨云班课计算机网络答案,基于蓝墨云班课的 《计算机网络与应用》实验课 教学改革探究...
  12. maccms10自动播放下一集
  13. 九宫格C语言递归程序,九宫格程序代码 共享并希望大家多提意见
  14. 集成混合运动与大功率柔性操作的半人马救灾机器人(4)——项目成果展示
  15. Python学习笔记之八皇后问题
  16. SAP 固定资产期初导入
  17. 单片机拟真电路图软件_单片机电流检测电路图大全(四款模拟电路设计原理图详解)...
  18. ubuntu 更换桌面为 KDE
  19. 【产业互联网周报】顺丰科技与圣辉征信达成数据流通合作;微软考虑模仿微信,建超级App;中国移动启动算力网络科学装置;...
  20. 树莓派开机不加载桌面全屏启动chromium浏览器

热门文章

  1. WB, IHC实验问题总结与处理方案
  2. Keil uvision 4 MDK 安装教程附免费安装包资源
  3. kaggle上传数据集遇到Default slug detected, please change values before uploading
  4. Qt学习(十一):QT设置静态数据库
  5. android rfid 数据解析_手持机是什么?RFID手持机是什么?
  6. python中循环结构分有,python常见循环结构有哪些
  7. c语言邻接表的构建_C++实现有向图邻接表的构建
  8. python读取excel送到网页_python+selenium excel中文读取填充到网页
  9. linux 无线网卡 延时 丢包 模拟,Linux模拟网络丢包与延迟的方法
  10. Python 网络爬虫笔记5 -- Beautiful Soup库实战