位图索引相对于常规的B-tree 索引,有着体积更加小的优势,节省空间。对于重复率特别高的字段,比如性别,比如省份。查询效率要优于B-tree 索引。那为什么我们总被告知在业务库中不要使用呢?

业务库一般要频繁的进行insert,update,delete 操作。下面通过实验测试位图索引对于DML操作的影响。

测试步骤

.Insert
insert
update
delete
.delete
insert
update
delete
.update
insert
update
delete

测试环境构建

create table t_bitmap(id number,sex varchar2(2));
create bitmap index idx_bitmap on t_bitmap(sex);
insert into t_bitmap values(1,'M');
insert into t_bitmap values(2,'F');
commit;

SQL> select * from t_bitmap;


ID SEX
---------- ----
1 M
2 F

1. INSERT 操作对其他DML的影响

Session 1 执行:
SQL> insert into t_bitmap values (3,'NA'); 1 row created.
Session2执行:

SQL> update t_bitmap set sex='F' where id=1;

1 row updated.

SQL> commit;

Commit complete.

SQL> delete from t_bitmap where id=1;

1 row deleted.

SQL> insert into t_bitmap values(1,'M');

1 row created.

SQL> commit;

Commit complete.

SQL> select * from t_bitmap;

ID SEX
---------- ----
1 M
2 F

Session 1 执行:

SQL> commit;

Commit complete.
SQL> select * from t_bitmap; ID SEX
---------- ----
1 M
2 F
3 NA

可见在有位图索引的列上做insert 操作不会发生任何阻塞。

2. DELETE 操作对其他操作的影响

Session 1 执行:
SQL> delete from t_bitmap where id=1; 1 row deleted.
Session2 执行:
SQL> update t_bitmap set sex='M' where id=2;
--发生阻塞
update t_bitmap set sex='M' where id=2
*
ERROR at line 1:
ORA-01013: user requested cancel of current operation SQL> SQL> SQL> delete from t_bitmap where id=2; 1 row deleted. SQL> delete from t_bitmap where id=3; 1 row deleted. SQL> insert into t_bitmap values (3,'F'); 1 row created. SQL> commit; Commit complete.
Session1 执行:
SQL> commit; Commit complete. SQL> select * from t_bitmap; ID SEX
---------- ----
3 F

可见delete 操作会对update 操作造成阻塞,但不影响insert ,delete 操作。

3. Update 操作对其他DML操作的影响

Session1 执行:
truncate table t_bitmap;
insert into t_bitmap values(1,'M');
insert into t_bitmap values(2,'F');
commit;
SQL> select * from t_bitmap; ID SEX
---------- ----
1 M
2 F
SQL> update t_bitmap set sex='F' where id=1; 1 row updated.
Session2 执行:
SQL> UPDATE T_BITMAP SET SEX='M' WHERE ID=2;  --update 被阻塞
UPDATE T_BITMAP SET SEX='M' WHERE ID=2  
*
ERROR at line 1:
ORA-01013: user requested cancel of current operation SQL> DELETE FROM T_BITMAP WHERE ID=2;      --delete 被阻塞
DELETE FROM T_BITMAP WHERE ID=2
*
ERROR at line 1:
ORA-01013: user requested cancel of current operation SQL> INSERT INTO T_BITMAP VALUES (3,'F');    --insert 被阻塞
Session1 执行:
SQL> select * from dba_locks where (lock_id1,lock_id2) in (SELECT lock_id1,lock_id2 FROM DBA_LOCKS WHERE BLOCKING_OTHERS='Blocking');  --session2 执行insert时查询到的锁情况。 SESSION_ID LOCK_TYPE MODE_HELD MODE_REQUE LOCK_ID1 LOCK_ID2 LAST_CONVERT BLOCKING_OTHERS
---------- -------------------- -------------------- ---------- ---------- ---------- ------------ --------------------
45 Transaction Exclusive None 131088 1478 563 Blocking
49 Transaction None Share 131088 1478 445 Not Blocking

SQL> select sid from v$mystat where rownum=1;

SID
----------
45

SQL> commit;

Commit complete.

SQL> select * from dba_locks where (lock_id1,lock_id2) =(SELECT lock_id1,lock_id2 FROM DBA_LOCKS WHERE BLOCKING_OTHERS='Blocking');

no rows selected

--可见,对位图索引列的更新操作,会阻塞 insert,delete,update 操作

总结

通过上面的实验,我们得出结论。业务库不是不能使用位图索引,但是有限制:对位图索引列不能存在update 操作,否则将阻塞该表几乎所有的DML操作, 引起严重的性能问题。如果只是做select,insert,delete 操作,是不会互相影响的。

位图索引对于DML操作的影响的更多相关文章

  1. Oracle 位图索引

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

  2. B树索引和位图索引的区别!

    B树索引主键和唯一性约束字段的B树索引,效率几乎和海量数据没有关系. 键值重复率低的字段比较适合使用B树索引. 位图索引键值重复率高的字段比较适合使用位图索引.count.and.or.in这些特定的 ...

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

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

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

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

  5. Sql Server之旅——第十站 看看DML操作对索引的影响

    我们都知道建索引是需要谨慎的,当只有利大于弊的时候才适合建,我们也知道建索引是需要维护成本的,这个维护也就在于DML操作了, 下面我们具体看看到底DML对索引都有哪些内幕.... 一:delete操作 ...

  6. Oracle索引——位图索引

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

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

    通过以下实验,来验证Bitmap位图索引较之普通的B-Tree索引锁的“高昂代价”.位图索引会带来“位图段级锁”,实际使用过程一定要充分了解不同索引带来的锁代价情况. 1.为比较区别,创建两种索引类型 ...

  8. oracle中位图索引和B-tree索引的区别

    1.适用系统的不同:位图索引适合OLAP系统,而B-tree索引适合OLTP系统. 2.占用存储空间不同:位图索引只需要很小的存储空间,而B-tree索引需要占用很大的存储空间. 3.创建需要的时间不 ...

  9. Atitit 索引技术--位图索引

    Atitit 索引技术--位图索引 索引在数据结构上可以分为三种B树索引.位图索引和散列索引 存储原理 编辑 位图索引对数据表的列的每一个键值分别存储为一个位图,Oracle对于不同的版本,不同的操作 ...

随机推荐

  1. 然之协同系统6.4.1 SQL注入之exp编写

    前言 前面已经说明了 漏洞成因,这里介绍一下 exp 的编写. 正文 为了 getshell 或者是 任意文件下载, 我们需要修改 数据库中的 前缀sys_file 表, 所以我们的利用方式如下 使用 ...

  2. [转]乔布斯的薄伽梵歌 Steve’s Bhagavat Gita

    SRC: http://www.brucejia.net/ 2014年4月4日未分类apple.ios.steve jobs 编辑 Your time is limited, so don't was ...

  3. input标签添加上disable属性在ios端字体颜色不兼容的问题

    input[disabled],input:disabled,input.disabled{ color: #3e3e3e; -webkit-text-fill-color: #3e3e3e; -we ...

  4. 在Qt中使用Font Awesome图标

    官网: http://fontawesome.io/中文网: http://www.fontawesome.com.cn/GitHub: https://github.com/FortAwesome/ ...

  5. Anaconda管理多版本的python环境

    通过Conda的环境管理功能,我们能同时安装多个不同版本的Python,并能根据需要自由切换.下面我将给大家分享一下,新增Python版本,切换,再切回主版本的详细过程. 方法/步骤   1 首先确保 ...

  6. 关闭TCP中135、139、445、593、1025 等端口的操作方法 (转)(记录下)

    操作要领:封闭端口,杜绝网络病毒对这些端口的访问权,以保障计算机安全,减少病毒对上网速度的影响. 近日发现有些人感染了新的网络蠕虫病毒,该病毒使用冲击波病毒专杀工具无法杀除,请各位尽快升级计算机上的杀 ...

  7. linux系统PKWindows系统,从各方便分析linux和Windows的优劣

    服务器系统linux系统和linux系统哪个好用,公说公有理婆说婆有理,今天鼎峰凡凡大概对Linux系统与Windows系统的优缺点PK!可以从以下几个方面来看 ①成本  赞成Linux的声音Linu ...

  8. 机器学习入门线性回归 岭回归与Lasso回归(二)

    一 线性回归(Linear Regression ) 1. 线性回归概述 回归的目的是预测数值型数据的目标值,最直接的方法就是根据输入写出一个求出目标值的计算公式,也就是所谓的回归方程,例如y = a ...

  9. Python 爬虫 获取标签下面的子标签

    thr_msgs = soup.find_all('div',class_=re.compile('msg')) for i in thr_msgs: print(i) first = i.selec ...

  10. ESS控制台发布新功能:创建多实例规格的伸缩配置

    背景 原弹性伸缩ESS服务限定,生效的伸缩配置中只能对应一种实例规格,这样就会存在如果生效的配置中的实例规格的库存不足(高配实例规格通常更容易出现库存不足的情况)时, 用户配置好的伸缩规则以及伸缩组对 ...