位图索引相对于常规的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. 转:使用VS Code断点调试PHP

    使用VS Code断点调试PHP vs code 使用一款杰出的轻量级代码编辑器,其中的插件工具不胜枚举而且还在不断增加.使用 vs code 调试 PHP 代码更是方便简洁,下面我们来一起看一下. ...

  2. MAVLink Onboard Integration Tutorial

    MAVLink Onboard Integration Tutorial MAVLink is a header-only library, which means that you don't ha ...

  3. Flex 加载dwg

    之前写的几种格式不是专门gis格式,这次来说说加载dwg.首先dwg格式不同于dxf格式,虽然autocad都能加载进去,真正用的比较多的是dwg格式,反正测绘,国土规划部门都是,吐槽下,然而auto ...

  4. Install Python on Mac

    1. 从官网下载最新版Python 3.X 后安装:由于Mac OS X EI Capitan中默认已经集成了 Python 2.7,因此需要在Terminal中输入 Python3 来检测是否安装成 ...

  5. Gensim入门教程

    What is Gensim? Gensim是一款开源的第三方Python工具包,用于从原始的非结构化的文本中,无监督地学习到文本隐层的主题向量表达.它支持包括TF-IDF,LSA,LDA,和word ...

  6. 代码整洁之道读书笔记(Ch4-Ch7)

    这几章从注释.程序格式.对象与数据结构的规范以及错误处理四个方面介绍了如何使代码变得简洁易懂.不同于上次摘抄的方法,这一次我会结合第一次个人作业的代码进行分析. 第四章  注释 这一章告诉我们,好的注 ...

  7. alembic 数据库管理

    alembic简介 Alembic是SQLAlchemy作者编写的Python数据库迁移工具 安装 pip install alembic alembic 操作流程 初始化 alembic init ...

  8. 从golang-gin-realworld-example-app项目学写httpapi (二)

    https://github.com/gothinkster/golang-gin-realworld-example-app/blob/master/users/models.go 模型定义 use ...

  9. 25个最佳的SSH命令

    参考文献地址(SSH原理与运用(一):远程登录): http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html 参考文献地址(SSH原理与 ...

  10. PHP面试常用算法(推荐)

    一.冒泡排序 基本思想: 对需要排序的数组从后往前(逆序)进行多遍的扫描,当发现相邻的两个数值的次序与排序要求的规则不一致时,就将这两个数值进行交换.这样比较小(大)的数值就将逐渐从后面向前面移动. ...