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

1.为比较区别,创建两种索引类型的测试表

1)在表t_bitmap上创建位图索引

SYS@ORA11GR2>create table t_bitmap (id number

(10),name varchar2(10),sex varchar2(1));

Table created.

SYS@ORA11GR2>createbitmap indext_bitmap_idx on t_bitmap(sex);

Index created.

2)在表t_btree上创建普通B-Tree索引

SYS@ORA11GR2>create table t_btree (id

number(10),name varchar2(10),sex varchar2(1));

Table created.

SYS@ORA11GR2>createindext_btree_idx

on t_btree(sex);

Index created.

2.每张表中初始化两条数据

1)初始化数据t_bitmap表数据

SYS@ORA11GR2>insert into t_bitmap

values(1,'WANG','M');

1 row created.

SYS@ORA11GR2>insert into t_bitmap

values(2,'chen','F');

1 row created.

2)初始化数据t_btree表数据

SYS@ORA11GR2>insert into t_btree

values(1,'WANG','M');

1 row created.

SYS@ORA11GR2>insert into t_btree

values(2,'chen','F');

1 row created.

SYS@ORA11GR2>commit;

Commit complete.

3)查看初始化之后的结果

SYS@ORA11GR2>select * fromt_bitmap;

ID NAMES

---------- ---------- -

1

WANGM

2

chenF

SYS@ORA11GR2>select * fromt_btree;

ID

NAMES

---------- ---------- -

1

WANGM

2

chenF

3.在两个不同的session中,对具有普通B-Tree索引表t_btree演示插入、修改和删除“男孩”数据

——第一个session中的插入后不要提交

SYS@ORA11GR2>insert into t_btree values

(3,'ANDY','M');

1 row created.

——第二个session中插入同样的状态数据,可以看到,插入、修改和删除均能够成功完成!

SYS@ORA11GR2>insert into t_btree

values(4,'tut','M');

1 row created.

SYS@ORA11GR2>update t_btree set sex='M' where

id=2;

1 row updated.

4.在两个不同的session中,对具有Bitmap位图索引表t_bitmap演示插入、修改和删除“男孩”数据

1)第一个session中的插入后不要提交

SYS@ORA11GR2>insert into t_bitmap

values(3,'ANDY','M');

1 row created.

2)第二个session中对男孩数据进行处理,可以看到,只要操作信息中涉及到位图索引列的插入、修改和删除均无法完成!!

(1)插入测试当插入数据涉及位图索引列“sex”字段时,是无法完成的。

SYS@ORA11GR2>insert into t_bitmap

values(4,'tut','M');

问题出现了:出现了“锁等待”停滞不动的现象!

当插入数据未涉及位图索引列“sex”字段时,是可以完成的。

SYS@ORA11GR2>insert into t_bitmap(id,name)values(4,'tut');

1 row created.

SYS@ORA11GR2>commit;

Commit complete.

(2)更新测试此时第二个会话的测试数据内容如下:

当更新位图索引列“sex”字段值为“M”时,是无法完成的。此时成功,是因为第一行数据的sex值本身就是“M”。

SYS@ORA11GR2>update t_bitmap set sex='M' where

id=1;

1 row updated.

SYS@ORA11GR2>update t_bitmap set sex='M' where

id=2;

问题出现了:出现了“锁等待”停滞不动的现象!

SYS@ORA11GR2>update t_bitmap set sex='M' where

id=4;

问题出现了:出现了“锁等待”停滞不动的现象!

另外,特别注意一下,如果更新的列不是位图索引对应的列,将不会受位图段级索引锁的限制。如下所示。

SYS@ORA11GR2>update t_bitmap set name='xu' where

id=2;

1 row updated.

SYS@ORA11GR2>select * from t_bitmap;

ID

NAMES

---------- ---------- -

1

WANGM

2

xuF

4 tut

(3)删除测试

SYS@ORA11GR2>delete from t_bitmap where id=1;

出现了“锁等待”停滞不动的现象!

SYS@ORA11GR2>delete from t_bitmap;

问题出现了:出现了“锁等待”停滞不动的现象!

总结:

1.对于B-Tree索引来说,插入动作不影响其他会话的DML操作;但是,对于Bitmap索引来说,由于是索引段级锁,会导致与操作列值相关的内容被锁定(文中提到的“M”信息)。

2.产生上面现象的原因:位图索引被存储为压缩的索引值,其中包含了一个范围内的ROWID,因此ORACLE必须针对一个给定值锁定所有范围内的ROWID,不支持行级别的锁定。换一种描述方法:使用位图索引时,一个键指向多行(成百上千),如果更新一个位图索引键,会同时将其他行对应位图索引字段进行锁定!3.较之bitmap索引优点:位图以一种压缩格式存放,因此占用的磁盘空间比B-Tree索引要小得多4.较之bitmap索引缺点:这种锁定的代价很高,会导致一些DML语句出现“锁等待”,严重影响插入、更新和删除的效率,对于高并发的系统不适用。5.位图索引使用原则:位图索引主要用于决策支持系统或静态数据,不支持索引行级锁定。位图索引最好用于低cardinality列(即列的唯一值除以行数为一个很小的值,接近零),例如上面的“性别”列,列值有“M”,“F”两种。在这个基本原则的基础上,要认真考虑包含位图索引的表的操作特点,如果是并发操作高的系统,不适合使用位图索引!

oracle位图索引和普通索引区别,【索引】Bitmap位图索引与普通的B-Tree索引锁的比较...相关推荐

  1. Oracle与Mysql主键、索引及分页的区别小结

    Oracle与Mysql主键.索引及分页的区别,学习oracle的朋友可以参考下 区别: 1.主键,Oracle不可以实现自增,mysql可以实现自增. oracle新建序列,SEQ_USER_Id. ...

  2. 位图索引和B tree索引的区别

    (1).与索引相关视图 查询DBA_INDEXES视图可得到表中所有索引的列表:访问USER_IND_COLUMNS视图可得到一个给定表中被索引的特定列. (2).组合索引概念 当某个索引包含有多个已 ...

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

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

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

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

  5. 详解:Oracle 数据库空间表、自定义用户、权限管理、序列、同义词、索引

    一:数据库空间表 表空间是数据库逻辑结构的一个重要组件,可以存放各种应用对象,如表.索引.每一个表空间由一个或多个数据文件组成. 表空间分类: 1.永久性表空间 一般保存表.视图.过程和索引等的数据. ...

  6. 键、索引、约束及其区别

    键.索引.约束及其区别 今天下午刚好没事,把一些基础性的概念理顺一下,存档,省的麻烦,嘿嘿 一.索引 1.       什么是索引? 索引是对数据库表中一列或多列的值进行排序的一种结构. 在关系型数据 ...

  7. 索引全扫描与索引快速扫描的区别

    1.索引全扫描(index full scan),跟随全表扫描样,索引也存在全扫描.全索引扫描只在CBO下有效,当优化器认为全索引扫描比全表扫描更有效时,才使用全索引扫描. 例如:select id ...

  8. MySQL主键与索引的联系和区别

    关系数据库依赖于主键,它是数据库物理模式的基石.主键在物理层上只有两个前途: 唯一地标识一行 作为一个可以被外键有效引用的对象 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分) ...

  9. 在Git中,HEAD,工作树和索引之间有什么区别?

    有人能告诉我在Git中HEAD,工作树和索引之间的区别吗? 据我所知,它们都是不同分支的名称. 我的假设是否正确? 编辑 我找到了这个 单个git存储库可以跟踪任意数量的分支,但是您的工作树只与其中一 ...

最新文章

  1. 使用隐式Intent打开系统内置拨号界面
  2. 我的思维模式的阿喀琉斯之踵
  3. linux培训机构 网络班,Linux基础教程之网络基础知识与Linux网络配置
  4. c++ 单引号和双引号
  5. cdr非法软件 您的产品已被禁用怎么回事_多层刺网非法捕鱼 顺庆男子被取保候审...
  6. LINQ SQL分组取最近一条记录
  7. Windows server 2008 iis7 下配置PHP+MySql
  8. 【鱼眼镜头5】[中央全向相机畸变模型]:统一相机模型,四阶多项式对统一相机模型进行建模
  9. C# NOPI读取Excel
  10. swift中swiftNotice的pleaseWait()方法
  11. 千锋培训的python
  12. 小小靖Java成长日记02
  13. mysql的连接配置时区语句
  14. 利用kali hydra 暴力破解Windows7(hydra的基本用法)会继续更新
  15. 体育教学与计算机技术的结合点,浅析计算机技术在高校体育教学中的应用
  16. 数学计算软件(Matlab、Mathematica)网页版
  17. Python经典实验4-字典和集合的应用
  18. 学习路上——技术书籍摸爬滚打
  19. 第二章--图形图像处理技术——基础理论和基本工具的使用
  20. 计算机图形学--中点椭圆算法原理及代码实现

热门文章

  1. qpython3 l_【强化学习】python 实现 q-learning 例三(例一改写)
  2. linux命令总结(持续更新中····)
  3. 腾讯网迷你版如何关闭
  4. 爬取知乎上搞笑视频,一顿爆笑送给大家
  5. xiaomi5c手机解锁、刷机、打开开发者模式,打开root权限
  6. 智能手机进入开发者模式 小米2A 操作系统Android 4.4 开发者模式
  7. 百度地图手机端浏览器对点击事件不灵敏
  8. 基于FPGA的脉动阵列矩阵乘法
  9. oppo 升级 android 8.1,OPPO首发安卓8.1更新了什么
  10. 验房注意事项及细节,小编教你怎么验收