为什么索引能快速查找数据行及索引也涉及锁的机制

1、索引之所以能快速查找数据,就是因为比如B树索引就是利用二叉树(这里确切的说是B树)[这种数据结构及在此基础上的算法]能进行快速高效查找的特点。故而Oracle设计出了索引这种数据对象。

   注释:   任何索引的目的是减少对数据块的访问,那如何减少对数据块的访问,就是利用二叉树算法。

2、当更新位图所在的列时,由于要在不同的索引条目之间修改bit位,比如将第一条记录从01变为02,则必须将01所在的索引条目的第一个bit位改为0,再将02所在的索引条目的第一个bit位改为1。因此,在更新索引条目的过程中,会锁定位图索引里多个索引条目。也就是在此情况下同时只能有一个用户能够更新表T,从而降低了并发性。(在非此情况下还是可以多个用户同时够更新表T的(索引也会用到锁的机制)

例如,下面的例子:

表t_bitmap_test的内容如下:

SQL> select * from t_bitmap_test;

        ID     BITCOL
---------- ----------
         1          3
         2          2
         3          1
         4          3
         5          3

对表t_bitmap_test上的字段bitcol建立索引idx_t_bitmap_test

SQL> create bitmap index idx_t_bitmap_test on t_bitmap_test(bitcol);

索引已创建。


在会话A上,

SQL> update t_bitmap_test set bitcol=2 where id=5;

行已更改


接着在会话B上,

SQL> update t_bitmap_test set bitcol=1 where id=2;

此时,会话B上的update语句被阻塞了。

解释:

因为会话A上的update语句执行时,是将表上的bitcol=3改为bitcol=2,所以会在索引键值为bitcol=2和bitcol=3的索引条目上同时加上行级锁。

当会话B上的update语句执行时,是将表上的bitcol=2改为bitcol=1,所以先要在索引键值为bitcol=2和bitcol=1的索引条目上同时加上行级锁,才能执行update语句。

而由于会话A上的update语句还未提交,故它在索引键值为bitcol=2的索引条目上加的行级锁还在。而行级锁都是X(排他)锁模式的,即不兼容其他锁模式的锁,所以会话B上(的update语句)对应的服务器进程在索引键值为bitcol=2的索引条目上加不了行级锁。因此,会话B上的update语句执行被阻塞了。

注意:实验时,一定要是对加了索引的列进行修改,而且在会话A上该列值由e改为f,在会话B上该列值由e改为d(f改为t),即两个会话都会要在一个共同的索引条目上加锁的情况。


 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值