oracle重建索引(二)

本文探讨了Oracle数据库在线重建索引(rebuild online)的工作原理。通过跟踪rebuild online过程,发现Oracle使用临时表SYS_JOURNAL_XXXX来记录索引重建期间基表的数据变化,确保索引更新完整性的同时允许并发DML操作。

重建索引有多种方式,如drop and re-create、rebuild、rebuild online等。下面简单比较这几种方式异同以及优缺点:

相关文章:

oracle重建索引(一)


二、rebuild 和rebuild online
首先我们跟踪一下rebuild online的过程。

另开一个会话查看锁的信息:
SQL> SELECT OBJECT_NAME,LMODE FROM V$LOCK L,DBA_OBJECTS O WHERE O.OBJECT_ID=L.ID1 AND L.TYPE='TM' AND SID=14;

OBJECT_NAME LMODE
------------------------------ ----------
SYS_JOURNAL_10499 4
TEST 2

SQL> INSERT INTO TEST VALUES(11);

1 row inserted


SQL> COMMIT;

Commit complete
可以看到,在rebuild online期间,oracle对基表加的是RS所,此时我们可以对基表进行DML操作。但奇怪的话在相同的session中有一个SYS_JOURNAL_10499表被加SHARE锁,这个表是干什么用的呢?
我们看看trace文件,有这样的信息:

create table "SUK"."SYS_JOURNAL_10499" (C0 NUMBER(6,0), opcode char(1),
partno number, rid rowid, primary key( C0 , rid )) organization index
TABLESPACE "TEST"

CREATE UNIQUE INDEX "SUK"."SYS_IOT_TOP_10605" on
"SUK"."SYS_JOURNAL_10499"("C0","RID") INDEX ONLY TOPLEVEL TABLESPACE "TEST"
NOPARALLEL

drop table "SUK"."SYS_JOURNAL_10499"

我们在查查10499是什么东西:
SQL> SELECT OBJECT_NAME,OBJECT_TYPE FROM DBA_OBJECTS WHERE OBJECT_ID=10499;

OBJECT_NAME OBJECT_TYPE
------------------------------ ------------------
IDX_TEST_C1 INDEX

从这些信息可以推测:表SYS_JOURNAL_10499就是实现在重建索引时不阻塞DML操作而设计的,它存储的是在索引重建期间发生在基表的数据变化。可以推测,CREATE INDEX .... ONLINE应该也有一张类似的表。
实际上,oracle之所以在创建索引时锁表阻止DML操作就是为了防止不能索引新变化的数据,在online方式重建时,有了临时表SYS_JOURNAL_XXXX,oracle就可以放心大胆地让用户操作了,因为所有重建索引期间的数据变化信息都会保留在SYS_JOURNAL_XXX表中,当索引重建完后再加上SYS_JOURNAL_XXX记录的数据,就不会漏索引数据了。(XXX是被重建的索引对应的OBJECT_ID)

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

转载于:http://blog.itpub.net/231499/viewspace-63810/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值