天天看點

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

打算寫一系列的文章介紹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來說,隻是通路了T的ID列,T表新增NAME列,并不會影響存儲過程P_TEST。但是在10g及以前版本,Oracle的判斷依賴性達不到字段級。

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

SQL> CONN YANGTK/[email protected]已連接配接。

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/,如需轉載,請注明出處,否則将追究法律責任。

轉載于:http://blog.itpub.net/4227/viewspace-69441/