您的位置:首页 > 数据库 > Oracle

oracle重建索引(二)

2008-04-08 17:44 246 查看
导读:
  重建索引有多种方式,如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)

本文转自
http://space6212.itpub.net/post/12157/292116
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: