通过以下实验,来验证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”两种。在这个基本原则的基础上,要认真考虑包含位图索引的表的操作特点,如果是并发操作高的系统,不适合使用位图索引!
发表评论
-
大数据量转存(抽取、同步)
2012-11-22 01:23 681在大数据量的转存过程中,建议使用分批转存(不要一次转存过来 ... -
Oracle数据库优化要点总结
2012-10-22 10:33 694当oracle出现性能缓慢、 ... -
反向索引之应用
2012-10-19 15:54 752Oracle会自动为表的 ... -
PFILE与SPFILE差异
2012-10-17 11:56 7801.oracle实例启动时,寻找参数文件的顺序为 spf ... -
Oracle 分区简述
2012-10-12 12:01 676oracle8i起开始推出表分区的概念,最初只有范围分区、列表 ... -
关于Latch与Spin
2012-10-10 08:51 783latch 是一种轻量级用于保护oracle共享内存结构,用 ... -
完整的ORACLE的UTL_FILE的资料
2012-10-08 13:58 731转自:http://blog.csdn.net/alex197 ... -
RAID的类别使用(0,1,0+1,5)
2012-10-08 09:02 723raid0: 熟悉RAID 0的人都知道,它的读写速度是最高 ... -
oracle 裸设备使用和注解
2012-09-28 11:37 934看了一篇不错的的关于 ... -
EM无法登陆问题
2012-05-19 22:20 1277解决ORACLE的EM登录 这几 ... -
oracle的冷/热备份
2012-04-29 11:48 727一、 冷备份 冷 ... -
oracle安装、编译、参数配置
2011-06-09 19:23 686一、安装 按照以下标 ... -
Oracle个人笔记(SQL性能)2B
2011-06-09 19:20 6771.两者区别在哪?select trunc(sysdate,' ... -
start with...connect by prior用法
2011-06-09 19:18 645--当需要根据递归关系查询结果集时 start wit ... -
ORA-01157(表空间数据文件损坏需重建时)
2011-06-09 19:08 1020EM控制台报错如下: 处理步骤: 1. 备份该数据 ... -
工作积累(游标、权限、数组)2
2011-06-09 19:04 678--游标 一、显式游标通 ... -
工作积累(表空间、导出方案、触发器)1
2011-06-09 19:01 672--查看表空间、数据文件相关信息 1、查看表空间包含哪些数据 ... -
Oracle个人笔记(系统查询语句)3
2011-06-09 18:55 550查询锁的表的方法:(1 ... -
Oracle个人笔记(SQL性能)2A
2011-06-09 18:54 7031. ...group by (code,name); 性能要 ... -
Oracle个人笔记(基本规则)1
2011-06-09 18:52 6311.GRANT 权限 ON 表名(对象名) TO 用户;2.o ...
相关推荐
位图索引与B树(B-tree)索引是数据库管理系统中常见的两种索引结构,它们各自具有不同的特性和适用场景。在理解这两种索引之前,我们先来了解一下索引的基本概念。 索引是数据库为了加速数据检索而创建的一种数据...
现在,我们知道优化器如何对这些技术做出反应,清楚地说明 bitmap 索引和 B-tree 索引各自的最好应用。 在 GENDER 列适当地带一个 bitmap 索引,在 SAL 列上创建另外一个位图索引,然后执行一些查询。在这些列上,用...
#### B-树索引与位图索引的比较 **表11-1** 对两种索引进行了对比,这里详细解释图表给出的主要区别: 1. **适用范围:** B-树索引适用于大多数情况,尤其是高基数列;而位图索引则更适合于低基数列。 2. **存储...
bitmap-fangsongti-fonts-0.3-15.el6.noarch.rpm是centos工具包。
bitmap-console-fonts-0.3-15.el6.noarch.rpm是centos工具包。
离线安装包,测试可用
离线安装包,亲测可用
bitmap-fixed-fonts-0.3-15.el6.noarch.rpm是centos工具包。
本实验旨在通过创建并比较B*树索引和位图索引,探究不同类型的索引在处理具有大量重复值的数据集时的表现差异。实验结果表明,在处理重复值较多的情况下,位图索引相较于B*树索引有着明显的优势。 #### 二、实验...
离线安装包,亲测可用
bitmap-lucida-typewriter-fonts-0.3-15.el6.noarch.rpm是centos工具包。
Bitmap位图渲染与操作在Android应用开发中是至关重要的部分,尤其对于图形界面设计和游戏开发。本项目是一个Android应用源码示例,适合毕业生进行毕业设计学习,它深入探讨了如何在Android平台上处理和操作Bitmap...
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
离线安装包,亲测可用
离线安装包,测试可用
bitmap-miscfixed-fonts-0.3-15.el6.noarch.rpm是centos工具包。
Bitmap位图是Android系统中广泛使用的...总之,“Bitmap位图旋转范例”是一个很好的学习资源,通过研究这个工程,开发者可以掌握如何在Android中有效地处理Bitmap的旋转,同时了解与之相关的内存管理和性能优化技巧。
数据库索引的实现方式有多种,常见的有 B-Tree 索引、Hash 索引、fulltext 全文索引、bitmap 位图索引等。其中,B-Tree 索引是最常用的索引类型,例如 MsSql 使用的是 B+Tree 索引,Oracle 使用的是 B-Tree 索引。...
Bitmap位图缩放是图像处理中的常见操作,广泛应用于各种应用程序和系统中,例如手机壁纸适配、游戏画面渲染、图像编辑软件等。在Android开发中,Bitmap对象是用于存储和处理像素数据的核心类,而缩放Bitmap是优化...