Oracle中B-Tree索引与Bitmap位图索引的锁代价比较研究
转载自:http://blog.itpub.net/519536/viewspace-611296/ 通过以下实验,来验证Bitmap位图索引较之普通的B-Tree索引锁的“高昂代价”。位图索引会带来“位图段级锁”,实际使用过程一定要充分了解不同索引带来的锁代价情况。 1.为比较区别,创建两种索引类型的测试表 SEC@ora11g> create table t_bitmap (id number(10),name varchar2(10),sex varchar2(1));
Table created.
SEC@ora11g> create bitmap index t_bitmap_idx on t_bitmap(sex);
Index created.
2)在表t_btree上创建普通B-Tree索引 SEC@ora11g> create table t_btree (id number(10),sex varchar2(1));
Table created.
SEC@ora11g> create index t_btree_idx on t_btree(sex);
Index created.
2.每张表中初始化两条数据:“一个男孩”和“一个女孩” 1)初始化数据t_btree表数据 SEC@ora11g> insert into t_btree values (1,'Secoooler','M');
1 row created.
SEC@ora11g> insert into t_btree values (2,'Anna','F');
1 row created.
2)初始化数据t_bitmap表数据 SEC@ora11g> insert into t_bitmap values (1,'M');
1 row created.
SEC@ora11g> insert into t_bitmap values (2,'F');
1 row created.
SEC@ora11g> commit;
Commit complete.
3)查看初始化之后的结果 SEC@ora11g> select * from t_btree;
ID NAME S
---------- ---------- -
1 Secoooler M
2 Anna F
(2)t_bitmap表中包含两条数据 SEC@ora11g> select * from t_bitmap;
ID NAME S
---------- ---------- -
1 Secoooler M
2 Anna F
3.在两个不同的session中,对具有普通B-Tree索引表t_btree演示插入、修改和删除“男孩”数据 SEC@ora11g> insert into t_btree values (3,'Andy','M');
1 row created.
第二个session中插入同样的状态数据,可以看到,插入、修改和删除均能够成功完成 SEC@ora11g> insert into t_btree values (4,'Tutu','M');
1 row created.
SEC@ora11g> update t_btree set sex='M' where id=2;
1 row updated.
SEC@ora11g> delete from t_btree;
2 rows deleted.
4.在两个不同的session中,对具有Bitmap位图索引表t_bitmap演示插入、修改和删除“男孩”数据 SEC@ora11g> insert into t_bitmap values (3,'M');
1 row created.
2)第二个session中对男孩数据进行处理,可以看到,只要操作信息中涉及到位图索引列的插入、修改和删除均无法完成!! SEC@ora11g> insert into t_bitmap values (4,'M');
问题出现了:出现了“锁等待”停滞不动的现象! 当插入数据未涉及位图索引列“sex”字段时,是可以完成的。 SEC@ora11g> insert into t_bitmap(id,name) values (4,'Tutu');
1 row created.
SEC@ora11g> commit;
Commit complete.
(2)更新测试 SEC@ora11g> select * from t_bitmap;
ID NAME S
---------- ---------- -
1 Secoooler M
2 Anna F
4 Tutu
当更新位图索引列“sex”字段值为“M”时,是无法完成的。 SEC@ora11g> update t_bitmap set sex='M' where id=1;
1 row updated.
此时成功,是因为第一行数据的sex值本身就是“M”。 SEC@ora11g> update t_bitmap set sex='M' where id=2;
问题出现了:出现了“锁等待”停滞不动的现象! SEC@ora11g> update t_bitmap set sex='M' where id=4;
问题出现了:出现了“锁等待”停滞不动的现象! 另外,特别注意一下,如果更新的列不是位图索引对应的列,将不会受位图段级索引锁的限制。如下所示。 SEC@ora11g> update t_bitmap set name='Xu' where id=2;
1 row updated.
(3)删除测试 SEC@ora11g> delete from t_bitmap where id=1;
问题出现了:出现了“锁等待”停滞不动的现象! SEC@ora11g> delete from t_bitmap;
问题出现了:出现了“锁等待”停滞不动的现象! 5.小结 产生上面现象的原因: 较之B-Tree索引优点: 较之B-Tree索引缺点: 位图索引使用原则: Good luck. secooler – The End – (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |