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

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

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

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

  2. 位图索引(Bitmap Index)的故事

    您如果熟悉Oracle数据库,我想您对Thomas Kyte的大名一定不会陌生.Tomas主持的asktom.oracle.com网站享誉Oracle界数十年,绝非幸致.最近在图书馆借到这位Oracl ...

  3. Oracle中关于bitmap index的使用问题

    您如果熟悉 Oracle 数据库,我想您对 Thomas Kyte 的大名一定不会陌生. Tomas 主持的 asktom.oracle.com 网站享誉 Oracle 界数十年,绝非幸致.最近在图书 ...

  4. [每日一题] 11gOCP 1z0-052 :2013-09-27 bitmap index.................................................C37

    转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/12106027 正确答案C 这道题目是需要我们掌握位图索引知识点. 一.首先我们来看位图索引 ...

  5. Oracle索引——位图索引

    1.语法create bitmap index index_name on 表名(字段);2.举个例子你就能明白了:如有表 test(id,name,address)数据(1,张三,大连)(2,李四, ...

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

    B树索引.位图索引和散列索引   https://blog.csdn.net/huashanlunjian/article/details/84460436 索引在数据结构上可以分为三种B树索引.位图 ...

  7. Oracle 位图索引

    内容简介: 1.位图索引 1.1位图索引使用注意事项; 1.2 使用位图索引; 1.3 位图索引对DML操作的影响; 2.位图连接索引 2.1 明确需求后使用位图索引; 2.1创建位图连接索引的注意事 ...

  8. [转帖]B树索引和位图索引的结构介绍

    B树索引和位图索引的结构介绍 http://blog.itpub.net/12679300/viewspace-1174236/ 一  前言:? ROWID:包含键值的行的行ID,(查找块的最快方法, ...

  9. 位图索引:原理(BitMap index)

    http://www.cnblogs.com/LBSer/p/3322630.html 位图(BitMap)索引 前段时间听同事分享,偶尔讲起Oracle数据库的位图索引,顿时大感兴趣.说来惭愧,在这 ...

随机推荐

  1. C++ vector 实现二维数组

    在STL中Vector这一容器,无论是在封装程度还是内存管理等方面都由于传统C++中的数组.本文主要是关于使用Vector初始化.遍历方面的内容.其他二维的思想也是类似的. 这里简单叙述一下C++ 构 ...

  2. Eclipse Indigo 3.7.0 安装GIT插件

    Eclipse上安装GIT插件EGit 首先打开Eclipse,然后点击Help>Install New Software>Add. Name:EGit Location: http:// ...

  3. vue-cli的安装及使用

    一.    node 和npm 1.在安装vue-cli前,要确认自己的电脑是否安装了node和npm 2.查询版本如下(vue脚手架支持node@4.xx以上) node -v    查询node版 ...

  4. 067——VUE中vue-router之使用transition设置酷炫的路由组件过渡动画效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. windows 环境下python 安装 pypcap 并用pyinstaller打包到exe,解决DLL 加载失败。

    安装 PYQT5 pypcap 环境: windows10_x64 python3.6.3 pycharm2017.2.4 备注: 需要安装 Visual C++ Build Tools 2015 可 ...

  6. 软工作业No.1。Java实现WC.exe

    网址:https://github.com/a249970271/WC WC 项目要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个命令行程序,模仿已有w ...

  7. 玩转X-CTR100 l STM32F4 l ADC 模拟数字转换

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      本文介绍X-CTR100控制器 AD转换接 ...

  8. php require include 区别

    php提供了两种包含外部文件的方法:include()和require().include()语句是一个常规的php函数:而require() 是一种特殊的语言结构,它的使用受到一些限制.对这两者来说 ...

  9. Python 之 numpy 和 tensorflow 中的各种乘法(点乘和矩阵乘)

    点乘和矩阵乘的区别: 1)点乘(即“ * ”) ---- 各个矩阵对应元素做乘法 若 w 为 m* 的矩阵,x 为 m*n 的矩阵,那么通过点乘结果就会得到一个 m*n 的矩阵. 若 w 为 m*n ...

  10. [NLP] TextCNN模型原理和实现

    1. 模型原理 1.1 论文 Yoon Kim在论文(2014 EMNLP) Convolutional Neural Networks for Sentence Classification提出Te ...