暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle性能优化:SQL优化之十六——索引的建立online

oracleEDU 2017-11-11
1878

索引这么好,迫不及待的就要去建立索引,但是,建索引的姿势是否了解呢,本节就讲解建索引的注意事项。
普通的对表建索引将会导致针对该表的更新操作无法进行,需要等待索引建完。更新操作将会被建索引动作阻塞。而ONLINE建索引的方式却是不会阻止针对该表的更新操作,与建普通索引相反的是,ONLINE建索引的动作是反过来被更新操作阻塞。

案例说明

(这里只演示建索引加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;


可以看到建索引的会话被更新表会话阻塞。




最后修改时间:2021-04-28 20:27:03
文章转载自oracleEDU,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论