♣  

题目         部分

在Oracle中,在新建或重建索引时有哪些锁?


     


♣  

答案部分          



可以利用10704和10046事件跟踪新建或重建索引过程中的锁信息,命令为:

1alter session set events '10704 trace name context forever,level 10';2alter session set events '10046 trace name context forever,level 12';

 


新建或重建索引的锁信息如下图所示:

图 5-15 新建或重建索引的锁信息

不带ONLINE的新建或重建索引的SQL语句获取的是4级TM锁,它会阻塞任何DML操作。

在Oracle 10g中,带ONLINE的新建或重建索引的SQL语句在开始和结束的时候获取的是4级TM锁,而在读取表数据的过程中获取的是2级TM锁,所以,在Oracle 10g中,即使加上ONLINE也会阻塞其它会话的DML操作。

在Oracle 11g中,带ONLINE的新建或重建索引的SQL语句在整个执行过程中获取的是2级TM锁,并不会阻塞其它会话的DML操作,但是在创建或重建索引的过程中,其它的会话产生的事务会阻塞索引的创建或重建操作,所以必须结束其它会话的事务才能让创建或重建索引的操作完成。所以应该避免在业务高峰期创建索引。

在Oracle 11g带ONLINE的新建或重建索引的情况下:

① 过程中会持有OD(ONLINE DDL)、DL(Direct Loader Index Creation)两种类型的锁,在Oracle 10g下只有DL锁没有OD锁。

② 表级锁TM的持有模式为2级RS(Row Share)与3级RX(Row Exclusive)类型的锁互相兼容,因此不会在表级发生阻塞。

③ 阻塞发生在行级锁申请阶段,即请求的4级S(Share)类型的锁与执行DML的会话已经持有的6级X(Exclusive)锁之间存在不兼容的情况;相比非ONLINE方式的表级锁,锁的粒度上更加细化,副作用更小。

④ 新增以“SYS_JOURNAL_”为前缀的IOT表,记录与索引创建动作同时进行的其它DML操作修改过的记录,等到索引创建完成前将IOT表里的记录合并至索引中并删除IOT表。


©著作权归作者所有:来自51CTO博客作者小麦苗DB宝的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 【DB笔试面试641】在Oracle中,新建索引后统计信息是否自动收集?
  2. 【DB笔试面试555】在Oracle中,全文索引的作用是什么?
  3. ElasticSearch实战系列四: ElasticSearch理论知识介绍
  4. MySQL覆盖索引(Covering Index)
  5. MySQL索引之哈希索引和自适应哈希索引(Adaptive Hash Index)
  6. MySQL 续集 02
  7. MySQL 续集 03
  8. MySQL 续集 04
  9. Oracle分区表之分区范围扫描(PARTITION RANGE ITERATOR)与位图范围

随机推荐

  1. C/C++比java效率高的原因?
  2. 新手求教RandomAccessFile读写文件到底写
  3. Java中double型数组的HashCode产生
  4. 【java工具类】网站安全---将特殊字符编
  5. mvn依赖的jar,在项目中无法引用,求大神指点
  6. javascript(六)js事件绑定浏览器兼容解决方
  7. java httpclient访问某些网页报403错误
  8. 使用js模仿java的实体类对类/对象进行get
  9. Java——IO类,字节流读数据
  10. 关于的写法