oracle位图索引和普通索引区别,【索引】Bitmap位图索引与普通的B-Tree索引锁的比较...
通过以下实验,来验证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索引锁的比较...相关推荐
- Oracle与Mysql主键、索引及分页的区别小结
Oracle与Mysql主键.索引及分页的区别,学习oracle的朋友可以参考下 区别: 1.主键,Oracle不可以实现自增,mysql可以实现自增. oracle新建序列,SEQ_USER_Id. ...
- 位图索引和B tree索引的区别
(1).与索引相关视图 查询DBA_INDEXES视图可得到表中所有索引的列表:访问USER_IND_COLUMNS视图可得到一个给定表中被索引的特定列. (2).组合索引概念 当某个索引包含有多个已 ...
- 【Bitmap Index】B-Tree索引与Bitmap位图索引的锁代价比较研究
通过以下实验,来验证Bitmap位图索引较之普通的B-Tree索引锁的"高昂代价".位图索引会带来"位图段级锁",实际使用过程一定要充分了解不同索引带来的锁代价 ...
- mysql bitmap位图索引_Oracle位图索引(Bitmap Index)
欢迎进入Oracle社区论坛,与200万技术人员互动交流 >>进入 位图(bitmap)索引是另外一种索引类型,它的组织形式与B树索引相同,也是一棵平衡树.与B树索引的区别在于叶子节点里存 ...
- 详解:Oracle 数据库空间表、自定义用户、权限管理、序列、同义词、索引
一:数据库空间表 表空间是数据库逻辑结构的一个重要组件,可以存放各种应用对象,如表.索引.每一个表空间由一个或多个数据文件组成. 表空间分类: 1.永久性表空间 一般保存表.视图.过程和索引等的数据. ...
- 键、索引、约束及其区别
键.索引.约束及其区别 今天下午刚好没事,把一些基础性的概念理顺一下,存档,省的麻烦,嘿嘿 一.索引 1. 什么是索引? 索引是对数据库表中一列或多列的值进行排序的一种结构. 在关系型数据 ...
- 索引全扫描与索引快速扫描的区别
1.索引全扫描(index full scan),跟随全表扫描样,索引也存在全扫描.全索引扫描只在CBO下有效,当优化器认为全索引扫描比全表扫描更有效时,才使用全索引扫描. 例如:select id ...
- MySQL主键与索引的联系和区别
关系数据库依赖于主键,它是数据库物理模式的基石.主键在物理层上只有两个前途: 唯一地标识一行 作为一个可以被外键有效引用的对象 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分) ...
- 在Git中,HEAD,工作树和索引之间有什么区别?
有人能告诉我在Git中HEAD,工作树和索引之间的区别吗? 据我所知,它们都是不同分支的名称. 我的假设是否正确? 编辑 我找到了这个 单个git存储库可以跟踪任意数量的分支,但是您的工作树只与其中一 ...
最新文章
- 使用隐式Intent打开系统内置拨号界面
- 我的思维模式的阿喀琉斯之踵
- linux培训机构 网络班,Linux基础教程之网络基础知识与Linux网络配置
- c++ 单引号和双引号
- cdr非法软件 您的产品已被禁用怎么回事_多层刺网非法捕鱼 顺庆男子被取保候审...
- LINQ SQL分组取最近一条记录
- Windows server 2008 iis7 下配置PHP+MySql
- 【鱼眼镜头5】[中央全向相机畸变模型]:统一相机模型,四阶多项式对统一相机模型进行建模
- C# NOPI读取Excel
- swift中swiftNotice的pleaseWait()方法
- 千锋培训的python
- 小小靖Java成长日记02
- mysql的连接配置时区语句
- 利用kali hydra 暴力破解Windows7(hydra的基本用法)会继续更新
- 体育教学与计算机技术的结合点,浅析计算机技术在高校体育教学中的应用
- 数学计算软件(Matlab、Mathematica)网页版
- Python经典实验4-字典和集合的应用
- 学习路上——技术书籍摸爬滚打
- 第二章--图形图像处理技术——基础理论和基本工具的使用
- 计算机图形学--中点椭圆算法原理及代码实现
热门文章
- qpython3 l_【强化学习】python 实现 q-learning 例三(例一改写)
- linux命令总结(持续更新中····)
- 腾讯网迷你版如何关闭
- 爬取知乎上搞笑视频,一顿爆笑送给大家
- xiaomi5c手机解锁、刷机、打开开发者模式,打开root权限
- 智能手机进入开发者模式 小米2A 操作系统Android 4.4 开发者模式
- 百度地图手机端浏览器对点击事件不灵敏
- 基于FPGA的脉动阵列矩阵乘法
- oppo 升级 android 8.1,OPPO首发安卓8.1更新了什么
- 验房注意事项及细节,小编教你怎么验收