位图索引相对于常规的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. JS算法之八皇后问题(回溯法)

    八皇后这个经典的算法网上有很多种思路,我学习了之后自己实现了一下,现在大概说说我的思路给大家参考一下,也算记录一下,以免以后自己忘了要重新想一遍. 八皇后问题 八皇后问题,是一个古老而著名的问题,是回 ...

  2. js函数的节流与防抖

    一.防抖&节流 在前端开发中有一部分用户行为会频繁的触发事件执行,而对于DOM的操作.资源加载等耗费性能的处理,很可能会导致界面卡顿,甚至浏览器奔溃.函数的节流与防抖就是为了解决类似需求而产生 ...

  3. drupal7 获取当前使用的主题的名称

    直接引用全局变量就行: 参考: 代码测试: global $theme, $theme_key; echo $theme; echo '<br>'; echo $theme_key; 结果 ...

  4. mustache 模板,用于构造html页面内容

    Mustache 的模板语法很简单,就那么几个: {{data}} {{#data}} {{/data}} {{^data}} {{/data}} {{.}} {{<partials}} {{{ ...

  5. 原生mybaits学习笔记

    目录 简介 maven引入 核心配置文件 方式一(简单) 配置 操作 方式二(old) 创建接口 配置mapper.xml 实现接口 操作 方式三(常用) 创建接口 配置mapper.xml 操作 配 ...

  6. maven-windows使用

    目录 前言 安装 配置镜像 idea配置Maven 私服 安装到centos 访问 客户端配置私服 idea修改指定pom 项目发布到私服 jar包会自动从私服下载 从客户端导入第三方jar包 前言 ...

  7. Excel录入中实现单元格多选项自动下拉

    当我们在Excel表格中需要输入大量的重复数据时,往往利用数据的有效性来制作一个下拉菜单以提高重复数据的输入速度.但在实际的操作过程中,必须选中需要输入重复数据的单元格并单击该单元格右边的下拉箭头,才 ...

  8. asp.net 服务器控件的 ID,ClientID,UniqueID 的区别

    1.简述 ID是设计的时候自己所指定的ID,是我们分配给服务器控件的编程标识符,我们常常使用this.controlid来寻找控件,那么这个controlid就是这里所说的ID. ClientID是由 ...

  9. Sharepoint配置Projectserver

    1   需要创建一个project server application 程序. 2  创建一个内容数据库,这个比较简单,微软文档中如下表述: 3  创建一个Project Web App  需要用命 ...

  10. TMG 2010 为HTTPS协议添加非标准端口(443)

    1.添加加密端口时,编辑脚本addsslports.vbs  addsslports.vbs 脚本内容如下: Dim root Dim tpRanges Dim newRange Set root = ...