日期:2014-05-16  浏览次数:20456 次

[每日一题] 11gOCP 1z0-052 :2013-09-27 bitmap index.................................................C37

转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/12106027




正确答案C

 

这道题目是需要我们掌握位图索引知识点。

 

一、首先我们来看位图索引的组成

位图索引由Key、Start ROWID、End ROWID、Bitmap组成,如下图所示:



二、其次我们来看位图索引适用范围

1.适用于低基数列

2.更新键列的成本非常高

3.使用 OR/AND/NOT IN/COUNT(*) 谓词进行查询时效率较

 

三、最后我们来分析这道题为什么选C

1:bitmap 索引是分段存储的,也就是说很多条记录可能是分做了N段来存储,也就是有N个begin/end,当新的记录 insert 而使用以前未曾使用过的物理地址的时候,会产生一个bitmap 段来存储,就算只有一条记录
2: 当删除一条记录的时候,在bitmap索引上做了一个delete 的标记并用一新的记录来标记了,下面请看具体的演示
3: 当 dml发生的时候,会lock住某个值的存储bit的那一rowid所在的记录,参考下面的 row 中lock ,这样显然会影响并发

4、实验验证

(1)创建表

gyj@OCM> Create table gyj_bitmap_t1(id int ,name varchar2(10));

Table created.

(2)插入数据

gyj@OCM>  Begin 
  2     For i in 1 .. 10000 loop
  3  Insert into gyj_bitmap_t1 values(i,'AAAAA');
  4  Commit;
  5        end loop;
  6       End;
  7       /

PL/SQL procedure successfully completed.
gyj@OCM> Begin 
  2     For i in 10001 .. 20000 loop
  3  Insert into gyj_bitmap_t1 values(i,'BBBBB');
  4  Commit;
  5        end loop;
  6       End;
  7       /

(3)创建位图索引

gyj@OCM> create bitmap index b_idx_t1 on gyj_bitmap_t1(name);

Index created.

(4)在125号会话下修改id=1的一行数据

gyj@OCM> select sid from v$mystat where rownum=1;

       SID
----------
       125

gyj@OCM> Update gyj_bitmap_t1 set name='BBBBB' where id=1;

1 row updated.

(5)在125号会话下修改id=10001的一行数据,结果被阻塞了。。。

gyj@OCM> select sid from v$mystat where rownum=1;

       SID
----------
       149

gyj@OCM> Update gyj_bitmap_t1 set name='AAAAA' where id=10001;Update 

(6)查看锁

sys@OCM> select * from v$lock where sid in(125,149);

ADDR             KADDR                   SID TY        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK
---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
00000000910D8760 00000000910D87B8        125 AE        100          0          4          0       1177          0
00000000910D9118 00000000910D9170        149 TX      65541       1235          0          4        194          0
00000000910DA1D0 00000000910DA228        149 AE        100          0          4          0        480          0
00002B7A1402D830 00002B7A1402D890        125 TM      77552          0          3          0        212          0
00002B7A1402D830 00002B7A1402D890        149 TM      77552          0          3          0        194          0
000000008FB03048 000000008FB030C0        125 TX      65541       1235          6          0        212          1
000000008FB1F928 000000008FB1F9A0        149 TX     131093       1616          6          0        194          0

可以看出149号会话请求4号锁,一直没有持有,这个4号锁是什么呢,锁的标记符是:TX -65541 -1235,从这里可以分析出是在哪个回滚段的第几个事务槽。

sys@OCM> select to_c