rebuild index online阻塞情况分析

        rebuild index online说是不阻塞DML语句的执行,但是在开始和结束阶段需要获得类型为4的TM锁,如果此时有另外事务执行没有及时提交,或者比较大则有可能阻塞rebuild index,下面来重现这种情况。
        首先准备一张有点大的表,并建立一个索引,目的是使索引重建过程尽可能的长。
SQL> create table t_objects as select * from dba_objects;
SQL> insert into t_objects select * from t_objects;
SQL> /
SQL> /
SQL> commit;
SQL> create index ind_t_objects on t_objects(object_id);

        然后打开3个session,在session 1中执行:
SQL> select max(sid) from v$mystat;
目的是获得当前session的sid,同样需获得session 2的sid,然后开始rebuild索引:
SQL> alter index ind_t_objects rebuild online;

        赶紧去session 3中查看:
SQL> select b.sid, a.object_name, b.id1, b.type, b.lmode, b.request, b.ctime, b.block from dba_objects a, v$lock b where a.object_id(+)=b.id1 and (b.sid=1090 or b.sid=1078);

       SID OBJECT_NAME               ID1 TY      LMODE    REQUEST      CTIME      BLOCK
---------- ------------------ ---------- -- ---------- ---------- ---------- ----------
      1078 T_OBJECTS               11096 TM          2          0          0          0
      1078 T_OBJECTS               11096 DL          3          0          1          0
      1078 T_OBJECTS               11096 DL          3          0          1          0
      1078 SYS_JOURNAL_11116       11210 TM          4          0          0          0

        现在session 1(sid 1078 )在T_OBJECTS上加的TM锁的lmode是2,而session 2由于没有执行任何操作,还没有锁信息。
        然后去session 2中执行一条如下语句:
SQL> insert into t_objects select * from t_objects where rownum < 2;

        不提交,再去session 3中查看:
SQL> select b.sid, a.object_name, b.id1, b.type, b.lmode, b.request, b.ctime, b.block from dba_objects a, v$lock b where a.object_id(+)=b.id1 and (b.sid=1090 or b.sid=1078);

       SID OBJECT_NAME               ID1 TY      LMODE    REQUEST      CTIME      BLOCK
---------- ------------------ ---------- -- ---------- ---------- ---------- ----------
      1078 TAB$                                      4 TS          6          0         12          0
      1090 T_OBJECTS               11096 TM          3          0         14          1
      1078 T_OBJECTS               11096 TM          2          4         14          0
      1078 T_OBJECTS               11096 DL          3          0         15          0
      1078 T_OBJECTS               11096 DL          3          0         15          0
      1078 SYS_JOURNAL_11116       11210 TM          4          0         14          0
      1090                                     196640 TX          6          0         14          0
      1078                                     458755 TX          6          0         12          0

        可以看到session 2(sid 1090 )阻塞了session 1(session 2的block字段值为1),session 1请求的TM锁的类型为4,与session 2持有的类型为3的TM锁不兼容,因此造成了session 1的等待。

        在session 2中执行commit或rollback,随后session 1的索引rebuild过程顺利完成,因此在rebuild索引的时候尽量要选择在系统闲的时候进行,如果出现阻塞可以先把造成阻塞的会话kill掉。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/339291/viewspace-545479/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/339291/viewspace-545479/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值