位图索引对于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对于不同的版本,不同的操作 ...
随机推荐
- C#-求int数组中连续偶数列的个数
例如:[3, 3, 2, 2, 2, 4, 3, 5, 4, 6, 3]=>2,2,2,4;4,6 结果为2 [3, 3, 2,3, 2, 2, 4, 3, 5, 4, 6, 3]=&g ...
- 安卓app开发-02-安卓app快速开发
安卓app开发-02-安卓app快速开发 上一篇介绍了安卓 app 开发的工具和环境配置,本篇不涉及编程技术,适合小团队快速高效开发 APP制作流程 当有一个APP创意,该如何实现呢?是花数十万找AP ...
- bootstrap-table 分页增删改查之一(增加 删除)
先上效果图 引入js文件 <!--js jquery --> <script type="text/javascript" src="${pageCon ...
- PHPStorm/webstorm/PyCharm tips
phpstorm对于使用PHP开发web的人员来说,是一个非常不错的编辑开发IDE,以前用过sublime,但是相比于storm,sublime在浏览legacy代码,类代码编辑方面明显要逊色不少.同 ...
- Linux虚拟机将ip改为自定义模式网络
查看当前ip:ifconfig 配置linux的ip地址:vi /etc/sysconfig/network-scripts/ifcfg-ens33 BOOTPROTO="dhcp" ...
- python字典的排序
# -*- coding:UTF-8 -*- def dict_sort(): # 按照value的值从大到小的顺序进行排序 dic = {'a': 31, 'bc': 5, 'c': 3, 'asd ...
- 【Leetcode】【Easy】Contains Duplicate
Given an array of integers, find if the array contains any duplicates. Your function should return t ...
- 沉淀再出发:PHP的中级内容
沉淀再出发:PHP的中级内容 一.前言 前面我们介绍了PHP的简单的语法知识以及相关的用法,接下来我们将PHP+mysql以及PHP+ajax结合起来进行研究. 二.PHP+mysql ...
- 使用事务和SqlBulkCopy批量插入数据
SqlBulkCopy是.NET Framework 2.0新增的类,位于命名空间System.Data.SqlClient下,主要提供把其他数据源的数据有效批量的加载到SQL Server表中的功能 ...
- January 11 2017 Week 2nd Wednesday
One always has time enough, if one will apply it well. 如果你能好好地利用,你总有足够的时间. If you always feel that y ...