
案例说明
(这里只演示建索引加online的情况)
构建环境
SQL> drop table t purge;
SQL> create table t as select * from dba_objects;
SQL> insert into t select * from t;
SQL>
SQL>
SQL>
SQL> set timing on
开启一个会话,建立索引(online方式)
SQL> select sid from v$mystat where rownum=1;
SID
----------
29
创建索引:
SQL> create index idx_object_id on t(object_id) online;
Index created.
索引还为建完成时候,再开一个会话更新T表。
再开第二个会话,执行更新语句
SQL> select sid from v$mystat where rownum=1;
SID
----------
51
SQL> update t set object_id=99999 where object_id=9;
16 rows updated.
由于加了online,更新操作可以完成,但回去会话1查看,索引建立被阻塞,不能完成,直到更新事务结束。
SQL> commit;
Commit complete.
提交更新后,发现会话1建索引才完成:
开启第三个session,查看阻塞
SQL>select * from v$lock where sid in (29,51);
SQL> select *+no_merge(a) no_merge(b) */ (select username from v$session where sid=a.sid) blocker,a.sid,'is blocking', (select username from v$session where sid=b.sid) blocker,b.sid from v$lock a,v$lock b where a.block=1 and b.request>0 and a.id1=b.id1 and a.id2=b.id2;
可以看到建索引的会话被更新表会话阻塞。








