位图索引对于DML操作的影响
位图索引相对于常规的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操作的影响的更多相关文章
- Oracle 位图索引
内容简介: 1.位图索引 1.1位图索引使用注意事项; 1.2 使用位图索引; 1.3 位图索引对DML操作的影响; 2.位图连接索引 2.1 明确需求后使用位图索引; 2.1创建位图连接索引的注意事 ...
- B树索引和位图索引的区别!
B树索引主键和唯一性约束字段的B树索引,效率几乎和海量数据没有关系. 键值重复率低的字段比较适合使用B树索引. 位图索引键值重复率高的字段比较适合使用位图索引.count.and.or.in这些特定的 ...
- Oracle索引梳理系列(四)- Oracle索引种类之位图索引
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
- [转帖]B树索引和位图索引的结构介绍
B树索引和位图索引的结构介绍 http://blog.itpub.net/12679300/viewspace-1174236/ 一 前言:? ROWID:包含键值的行的行ID,(查找块的最快方法, ...
- Sql Server之旅——第十站 看看DML操作对索引的影响
我们都知道建索引是需要谨慎的,当只有利大于弊的时候才适合建,我们也知道建索引是需要维护成本的,这个维护也就在于DML操作了, 下面我们具体看看到底DML对索引都有哪些内幕.... 一:delete操作 ...
- Oracle索引——位图索引
1.语法create bitmap index index_name on 表名(字段);2.举个例子你就能明白了:如有表 test(id,name,address)数据(1,张三,大连)(2,李四, ...
- 【Bitmap Index】B-Tree索引与Bitmap位图索引的锁代价比较研究
通过以下实验,来验证Bitmap位图索引较之普通的B-Tree索引锁的“高昂代价”.位图索引会带来“位图段级锁”,实际使用过程一定要充分了解不同索引带来的锁代价情况. 1.为比较区别,创建两种索引类型 ...
- oracle中位图索引和B-tree索引的区别
1.适用系统的不同:位图索引适合OLAP系统,而B-tree索引适合OLTP系统. 2.占用存储空间不同:位图索引只需要很小的存储空间,而B-tree索引需要占用很大的存储空间. 3.创建需要的时间不 ...
- Atitit 索引技术--位图索引
Atitit 索引技术--位图索引 索引在数据结构上可以分为三种B树索引.位图索引和散列索引 存储原理 编辑 位图索引对数据表的列的每一个键值分别存储为一个位图,Oracle对于不同的版本,不同的操作 ...
随机推荐
- 什么是J2EE
什么是J2EE 一.准备篇 1 什么是J2EE?它和普通的Java有什么不同? 答:J2EE全称为Java2 Platform Enterprise Edition. "J2EE平台本质上是 ...
- zabbix连不上数据库
[root@localhost etc]# tail -f /var/log/zabbix_server.log 1267:20130722:195451.493 [Z3001] connection ...
- Windows系统环境下安装dlib
Windows系统环境下安装dlib 因为今天需要在windows环境下做一些图片处理,所以需要在pycharm中配置环境,而其中需要的主要是dlib的安装: 下面说一下关于dlib的配置安装: —- ...
- 万能的JDBC工具类。通过反射机制直接简单处理数据库操作
package com.YY.util; import java.io.IOException; import java.io.InputStream; import java.sql.Connect ...
- Delphi IDHTTP用法详解
一.IDHTTP的基本用法 IDHttp和WebBrowser一样,都可以实现抓取远端网页的功能,但是http方式更快.更节约资源,缺点是需要手动维护cook,连接等 IDHttp的创建,需要引入 ...
- 计算机应用基础教程作业flash动画 车辆工程 冯大昕
- windows下的FTP命令
假设要连接的FTP信息如下: FTP Server: FtpTest User: tester Password: 123123 打开Windows的开始菜单,执行"运行"命令,在 ...
- ZT I Believe I Can Fly(我相信我能飞)
I Believe I Can Fly(我相信我能飞) 歌手:R. Kelly(罗 凯利) 歌词部分 I used to think that I could not go on 我原以为我无法坚持下 ...
- kvm 虚拟机
关于text模式安装的一个问题 http://serverfault.com/questions/257962/kvm-guest-installed-from-console-but-how-to- ...
- css计数器 及 鼠标经过从中间扩散一个矩形(正方形长方形均可)
<!DOCTYPE html> <html> <head> <title>css计数器--兼容IE8</title> <meta ch ...