Oracle中bitmap索引问题
Oracle中bitmap索引问题,查询的where子句中的and和or条件直接对位图(bitmap)进行布尔运算,得到一个位图结果集,而无需将位图
1.什么是位图索引
在索引段中只需存储键的值,而无需存储rowid。在位图索引中每个位(bit)相当于可能存在这个键值得一行。
2.创建位图索引的好处
一:能节省存储索引的空间,传统的B*Tree会占用大量的存储空间,有时候可能比表多要大的多
3.建立位图索引的缺点
因为一个位图索引上得键值,可能指向多行记录,所以更新一行的时候,同时会吧位图索引指向的所有行都给锁定了,大大的降低了并发性。
4.位图索引如何在查询中工作
查询的where子句中的and和or条件直接对位图(bitmap)进行布尔运算,得到一个位图结果集,而无需将位图结果集转换为rowid,如果布尔运算后的结果集比较小,那么查询就能迅速的得要结果,,而不需要进行全表扫描。
5.位图索引例子:
先创建一个表
create table t(id int primary key,name varchar2(10),p_flag varchar2(1));
我们在p_flag上创建一个位图索引
create table t(id int primary key,name varchar2(10),p_flag varchar2(1));
插入数据
insert into t values(1,'hua','N');
insert into t values(3,'huang','Y');
insert into t values(2,'zhang','N');
我们尝试在一个session1中修改id为1,p_flag为N的行
update t set p_flag = 'Y' where id = 1;
这时我们并不着急commit,在另外一个session2中尝试修改id为2,的记录
update t set p_flag = 'Y' where id = 2;
我们发现session2被阻塞了。。不应该啊,因为Oracle只有在两个session同时修改同一条记录才会阻塞啊,那这时候为什么又阻塞了呢?答案是位图索引在作怪!!
这个例子说明位图索引,最后还是用在哪些经常要查询,但是很少修改的记录很大的表上,同时应该在低基数的列上建立位图索引(低基数是指:想对于表数据来说,每个列上得不同数据很少,比如性别只有两个不同值(男,女),但是性别这列所在的表中,可能有很多很数据)。