rebuild和rebuild online的区别
1、当rebuild 时一般对原先索引进行INDEX FAST FULL SCAN。
2、当rebuild online的时不用原先索引而执行TABLE ACCESS FULL
3、rebuild和rebuild online都会发生sort,即需要用到temp表空间。
4、rebuild 会阻塞dml语句而rebuild online则不会。
5、rebuild online时系统会产生一个SYS_JOURNAL_xxx的IOT类型的系统临时日志表,所有rebuild online时索引的变化都记录在这个表中,当新的索引创建完成后,把这个表的记录维护到新的索引中去,然后drop掉旧的索引,rebuild online就完成了。
在Oracle10g中,rebuild/create index online 需要特别小心
session 1 update一行,不提交---这个时候获得表的row exclusive锁
SQL> update test set owner='SB' where object_id=100;
已更新16行。
已用时间: 00: 00: 00.15
session 2 对表上面的索引rebuild online
SQL> alter index idx rebuild online;
等待中...
session 3 对表又进行dml操作
SQL> update test set owner='LUOBINGSEN' where object_id=10;
也等待...
查询锁等待的信息:
SQL> select oracle_username username,session_id sid,decode(
2 locked_mode,0,'None',1,'Null',2,'Row share',3,'Row Exclusive',4,'Share',
3 5,'Share Row Exclusive',6,'Exlusive') lock_type,object_name,xidusn,xidslot,xidsqn
4 from v$locked_object,dba_objects
5 where v$locked_object.object_id=dba_objects.object_id;
USERNAME SID LOCK_TYPE OBJECT_NAME XIDUSN XIDSLOT XIDSQN
-------------------- ---------- --------------- ------------------------------ ---------- ---------- ----------
SCOTT 148 Row share TEST 0 0 0
SCOTT 148 Row share TEST 0 0 0
SCOTT 148 Row share TEST 0 0 0
SCOTT 148 Row share TEST 0 0 0
SCOTT 148 Row share TEST 0 0 0
SCOTT 148 Row share TEST 0 0 0
SCOTT 148 Row share TEST 0 0 0
SCOTT 148 Row share TEST 0 0 0
SCOTT 148 Row share TEST 0 0 0
SCOTT 148 Row share TEST 0 0 0
SCOTT 145 Row Exclusive TEST 10 47 448
SCOTT 148 Row share TEST 0 0 0
SCOTT 145 Row Exclusive TEST 10 47 448
SCOTT 148 Share SYS_JOURNAL_53286 0 0 0
查询谁阻塞了谁
SQL> SELECT DECODE(request,0,'Holder: ','Waiter: ')|| sid as sid, id1, id2, lmode,
2 request, type FROM V$LOCK WHERE (id1, id2, type) IN
3 (SELECT id1, id2, type FROM V$LOCK WHERE request>0) ORDER BY id1, request;
SID ID1 ID2 LMODE REQUEST TY
------------------------------------------------ ---------- ---------- ---------- ---------- --
Holder: 145 53207 0 3 0 TM
Waiter: 150 53207 0 0 3 TM
Waiter: 148 53207 0 2 4 TM
可以看到,session 145 获得了 mode=3 也就是 row exclusive 模式的锁 session 148想获得 mode=4 也就是共享锁,
但是只得到了 mode=2 的行共享锁,session 150 想获得 mode=3 row exclusive锁,但是未获得,处于等待中。
所以,在Oracle10g中,rebuild index online是一个危险的动作,特别是热点表上面的索引,不要去rebuild/create index online
------------
|在Oracle11g |
------------
session 1 update一行,不提交
SQL> update test set owner='SB' where object_id=10;
已更新 1 行。
session 2 对表上面的索引rebuild online
SQL> alter index idx rebuild online;
等待中......
session 3 对表又进行dml操作
SQL> update test set owner='SB' where object_id=1;
已更新0行。
发现11g rebuild index online不阻塞dml
SQL> SELECT DECODE(request, 0, 'Holder: ', 'Waiter: ') || sid as sid,
2 id1,
3 id2,
4 lmode,
5 request,
6 type,
7 ctime
8 FROM V$LOCK
9 WHERE (id1, id2) IN (SELECT id1, id2 FROM V$LOCK WHERE request > 0)
10 ORDER BY id1, ctime desc;
SID ID1 ID2 LMODE REQUEST TYPE CTIME
------------------------------ ---------- ---------- ---------- ---------- ---- ----------
Holder: 26 327696 811 6 0 TX 1148
Waiter: 15 327696 811 0 4 TX 1119
到了Oracle11g,create/rebuild index online 是由以前的 mode=4 的 TM lock变成了 mode=4 的TX lock
MODE=4 的 TM lock 相当于给表(TM)加了共享锁,这个时候会阻塞其他会话插入,MODE=4 的 TX LOCK 相当于给行(TX)加的是共享锁,当然可以插入了。