Oracle11新特性——線上操作功能增強(三)

yangtingkun發表於2007-09-29

打算寫一系列的文章介紹11g的新特性和變化。

11g中線上處理功能得到了很大增強,其中包括線上修改表結構,線上建立或重建索引,建立不可見索引,表增加非空欄位,線上DDL以及物件依賴性細化等。

這一篇介紹Oracle物件依賴性判斷增強。

Oracle11新特性——線上操作功能增強(一):http://yangtingkun.itpub.net/post/468/400430

Oracle11新特性——線上操作功能增強(二):http://yangtingkun.itpub.net/post/468/401293


在11g之前,Oracle判斷依賴性只達到了物件級,也就是說儲存過程訪問的物件一旦發生了變化,那麼Oracle就會將儲存過程置為INVALID狀態。

Oracle使用這種方法強制儲存過程在下次執行之前進行重編譯,避免表結構改變後,儲存過程沒有更新,從而得到錯誤的結果。

這種方法沒有問題,但是有的時候修改往往和關聯的儲存過程沒有關係,但是Oracle並不對這種情況進行判斷,這樣會造成很多不需要重新編譯的儲存過程也被置於INVALID狀態:

SQL> CREATE TABLE T (ID NUMBER);

表已建立。

SQL> CREATE OR REPLACE PROCEDURE P_TEST AS
2 BEGIN
3 INSERT INTO T (ID) VALUES (1);
4 END;
5 /

過程已建立。

SQL> SELECT OBJECT_NAME, OBJECT_TYPE, STATUS FROM USER_OBJECTS WHERE OBJECT_NAME = 'P_TEST';

OBJECT_NAME OBJECT_TYPE STATUS
------------------------------ ------------------- -------
P_TEST PROCEDURE VALID

SQL> ALTER TABLE T ADD (NAME VARCHAR2(30));

表已更改。

SQL> SELECT OBJECT_NAME, OBJECT_TYPE, STATUS FROM USER_OBJECTS WHERE OBJECT_NAME = 'P_TEST';

OBJECT_NAME OBJECT_TYPE STATUS
------------------------------ ------------------- -------
P_TEST PROCEDURE INVALID

SQL> SELECT * FROM V$VERSION;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production

上面這個簡單的例子就說明了這種情況,對於儲存過程P_TEST來說,只是訪問了TID列,T表新增NAME列,並不會影響儲存過程P_TEST。但是在10g及以前版本,Oracle的判斷依賴性達不到欄位級。

而從11g開始,Oracle細化了依賴性的判斷,下面看看在11g中同樣的例子:

SQL> CONN YANGTK/yangtk@ORA11G已連線。
SQL> CREATE TABLE T (ID NUMBER);

表已建立。

SQL> CREATE OR REPLACE PROCEDURE P_TEST AS
2 BEGIN
3 INSERT INTO T (ID) VALUES (1);
4 END;
5 /

過程已建立。

SQL> SELECT OBJECT_NAME, OBJECT_TYPE, STATUS FROM USER_OBJECTS WHERE OBJECT_NAME = 'P_TEST';

OBJECT_NAME OBJECT_TYPE STATUS
------------------------------ ------------------- -------
P_TEST PROCEDURE VALID

SQL> ALTER TABLE T ADD (NAME VARCHAR2(30));

表已更改。

SQL> SELECT OBJECT_NAME, OBJECT_TYPE, STATUS FROM USER_OBJECTS WHERE OBJECT_NAME = 'P_TEST';

OBJECT_NAME OBJECT_TYPE STATUS
------------------------------ ------------------- -------
P_TEST PROCEDURE VALID

SQL> SELECT * FROM V$VERSION;

BANNER
-----------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 -
Production PL/SQL Release 11.1.0.6.0 - Production
CORE 11.1.0.6.0 Production
TNS for Linux: Version 11.1.0.6.0 - Production
NLSRTL Version 11.1.0.6.0 - Production

欄位級依賴性的資訊儲存在dependency$d_attrs列中。具體演算法就不描述了,根物化檢視日誌中CHANGE_VECTOR$$的演算法十分類似。有興趣的話可以參考:http://yangtingkun.itpub.net/post/468/20498

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-69441/,如需轉載,請註明出處,否則將追究法律責任。

相關文章