日期:2014-05-16 浏览次数:20450 次
转载请注明出处: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 段来存储,就算只有一条记录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