打算写一系列的文章介绍11g的新特性和变化。
11g中在线处理功能得到了很大增强,其中包括在线修改表结构,在线创建或重建索引,建立不可见索引,表增加非空字段,在线DDL以及对象依赖性细化等。
这一篇介绍Oracle11g在线重建索引功能增强。
Oracle11新特性——在线操作功能增强(一):http://yangtingkun.itpub.net/post/468/400430
Oracle11新特性——在线操作功能增强(二):http://yangtingkun.itpub.net/post/468/401293
Oracle11新特性——在线操作功能增强(三):http://yangtingkun.itpub.net/post/468/401641
Oracle11新特性——在线操作功能增强(四):http://yangtingkun.itpub.net/post/468/402220
Oracle11新特性——在线操作功能增强(五):http://yangtingkun.itpub.net/post/468/402802
Oracle11新特性——在线操作功能增强(六):http://yangtingkun.itpub.net/post/468/402977
11加强了ONLINE REBUILD索引功能,减少了ONLINE REBUILD索引过程中对DML操作的阻塞。
下面看看10g中和11g在线重建索引的差别,首先登陆10g:
SQL> CREATE TABLE T AS SELECT ROWNUM ID, A.* FROM DBA_OBJECTS A;
表已创建。
SQL> CREATE INDEX IND_T_NAME ON T(OBJECT_NAME);
索引已创建。
SQL> DELETE T WHERE ID = 1;
已删除 1 行。
会话1中建立表和索引后,删除一条记录,且不提交。
SQL> SET SQLP 'SQL2> '
SQL2> ALTER INDEX IND_T_NAME REBUILD;
ALTER INDEX IND_T_NAME REBUILD
*第 1 行出现错误:
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源
SQL2> ALTER INDEX IND_T_NAME REBUILD ONLINE;
在会话2上尝试重建索引。
由于无法马上获取锁,直接REBUILD INDEX会报错,而REBUILD INDEX ONLINE则会处于等待状态,直到获取表的锁。
IXDBA.NET社区论坛这时在会话1上查询锁信息和会话2的等待情况:
SQL> SELECT SID FROM V$MYSTAT WHERE ROWNUM = 1;
SID
----------
148
SQL> SELECT SID FROM V$SESSION WHERE USERNAME = 'YANGTK';
SID
----------
144
148
SQL> SELECT SID, TYPE, ID1, CTIME, BLOCK FROM V$LOCK WHERE SID IN (144, 148);
SID TY ID1 CTIME BLOCK
---------- -- ---------- ---------- ----------
144 DL 52896 360 0
144 DL 52896 360 0
148 TM 52896 417 1
144 TM 52896 360 0
144 TM 52899 359 0
148 TX 65575 417 0
已选择6行。
SQL> COL EVENT FORMAT A40
SQL> COL P1TEXT FORMAT A20
SQL> SELECT EVENT, P1TEXT, P1, SECONDS_IN_WAIT FROM V$SESSION_WAIT WHERE SID = 144;
EVENT P1TEXT P1 SECONDS_IN_WAIT
---------------------------------------- -------------------- ---------- ---------------
enq: TM - contention name|mode 1414332420 749
会话2处于等待锁的状态中,下面提交会话1的修改,随后马上执行一个DELETE操作。为了避免COMMIT和DELETE操作间隔时间太大,在文本编辑器中,将两个命令编辑好,拷贝到剪贴板,然后一起拷贝到SQLPLUS中:
SQL> COMMIT;
提交完成。
SQL> DELETE T WHERE ID = 2;
已删除 1 行。
SQL> SELECT SID, TYPE, ID1, CTIME, BLOCK FROM V$LOCK WHERE SID IN (144, 148);
SID TY ID1 CTIME BLOCK
---------- -- ---------- ---------- ----------
144 DL 52896 828 0
144 DL 52896 828 0
148 TM 52896 26 1