Oracle中bitmap索引问题

2014-11-24 18:32:04 · 作者: · 浏览: 0

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;


这个例子说明位图索引,最后还是用在哪些经常要查询,但是很少修改的记录很大的表上,同时应该在低基数的列上建立位图索引(低基数是指:想对于表数据来说,每个列上得不同数据很少,比如性别只有两个不同值(男,女),但是性别这列所在的表中,可能有很多很数据)。