oracle重建索引(二)

space6212發表於2019-07-21

重建索引有多種方式,如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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章