出差期间,其实很累了,坚持发一个吧~ 算不上深入,但总算是记录没有间断。
这是一个典型的问题,TOM在他的书中提到了关于bitmap index对于系统并发性能的影响。
普通的TX 的阻塞,没有那么抽象,比较容易理解。
但是bitmap index呢?
这里在三个会话之间简单测试一下几种典型的因bitmap index 阻塞的场景。
/*准备工作,并开启3个会话*/
create table table1
(id number,
Fname varchar(20),
sex varchar(2));
alter table table1 add constraint pk_table1 primary key (id)
create bitmap index indx_sex on table1 (sex);
insert into table1 values (1,'aaa','a');
insert into table1 values (2,'bbb','b');
insert into table1 values (3,'ccc','a');
commit
select * from table1
/*CASE1 开始验证update bitmap列会引起bitmap阻塞*/
/*session 1*/
update table1 set sex='b' where id=1
/*session 2*/
update table1 set sex='b' where id=3 --被阻塞
/*session 3 sysdba查看阻塞信息*/
select * from dba_waiters;
select * from v$transaction;
/*CASE2 开始验证update 非bitmap列不会引起bitmap阻塞*/
/*session 1*/
update table1 set Fname='uuu' where id=1
/*session 2*/
update table1 set sex='b' where id=3 --不被阻塞
/*CASE3 开始验证insert 并含已有bitmap值会引起bitmap阻塞*/
/*session 1*/
insert into table1 values (4,'ddd','a');
/*session 2*/
update table1 set sex='b' where id=3 --被阻塞
/*session 3 sysdba查看阻塞信息*/
select * from dba_waiters;
select * from v$transaction;
/*CASE4 开始验证insert 不含有现有bitmap值,则不会引起bitmap阻塞*/
/*session 1*/
insert into table1 values (4,'ddd','c');
/*session 2*/
update table1 set sex='b' where id=3 --不被阻塞
/*CASE5 开始验证delete 会引起bitmap阻塞*/
/*session 1*/
delete from table1 where id=1;
/*session 2*/
update table1 set sex='b' where id=3 --被阻塞
/*session 3 sysdba查看阻塞信息*/
select * from dba_waiters;
select * from v$transaction;