出差期间,其实很累了,坚持发一个吧~ 算不上深入,但总算是记录没有间断。
这是一个典型的问题,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;
本文通过五个案例展示了在Oracle数据库中,更新、插入和删除操作如何影响到Bitmap索引,并导致事务间的阻塞现象。实验涵盖了不同场景下Bitmap索引的阻塞特性。
494

被折叠的 条评论
为什么被折叠?



