打算寫一系列的文章介紹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/