Oracle並行新增主鍵

zhang_1202發表於2015-11-12

環境:Oracle 11.2.0.3

需求:生產庫幾張大的分割槽表,分別有主鍵約束和索引,當定期清理掉過期資料後(基本3個月內資料),global index失效,rebuild耗時成本相對新建大,於是決定先drop再create主鍵,最好是並行執行:

1.直接新增,提示ora-3001:未實施的功能;只能單執行緒建立主鍵

SQL> alter table t add constraint pk_t primary key (object_id) using index online parallel 2; alter table t add constraint pk_t primary key (object_id) using index online parallel 2 ORA-03001: 未實施的功能 SQL> alter table t add constraint pk_t primary key (object_id) using index online; Table altered

SQL> alter table t drop primary key; Table altered

2.考慮先並行新增惟一性索引,再新增主鍵

SQL> create unique index pk_t on t(object_id) parallel 2 online; Index created

SQL> alter table t add constraint pk_t primary key (object_id); Table altered

SQL> alter index pk_t noparallel; Index altered

3.對比主鍵和惟一性索引的區別

SQL> desc t
Name           Type          Nullable Default Comments -------------- ------------- -------- ------- -------- OWNER          VARCHAR2(30)  Y                        
OBJECT_NAME    VARCHAR2(128) Y                        
SUBOBJECT_NAME VARCHAR2(30)  Y                        
OBJECT_ID      NUMBER                                 
DATA_OBJECT_ID NUMBER        Y                        
OBJECT_TYPE    VARCHAR2(19)  Y                        
CREATED        DATE          Y                        
LAST_DDL_TIME  DATE          Y                        
TIMESTAMP      VARCHAR2(19)  Y                        
STATUS         VARCHAR2(7)   Y                        
TEMPORARY      VARCHAR2(1)   Y                        
GENERATED      VARCHAR2(1)   Y                        
SECONDARY      VARCHAR2(1)   Y                        
NAMESPACE      NUMBER        Y                        
EDITION_NAME   VARCHAR2(30)  Y                        

SQL> alter table t drop primary key; Table altered

SQL> desc t
Name           Type          Nullable Default Comments -------------- ------------- -------- ------- -------- OWNER          VARCHAR2(30)  Y                        
OBJECT_NAME    VARCHAR2(128) Y                        
SUBOBJECT_NAME VARCHAR2(30)  Y                        
OBJECT_ID      NUMBER        Y                        
DATA_OBJECT_ID NUMBER        Y                        
OBJECT_TYPE    VARCHAR2(19)  Y                        
CREATED        DATE          Y                        
LAST_DDL_TIME  DATE          Y                        
TIMESTAMP      VARCHAR2(19)  Y                        
STATUS         VARCHAR2(7)   Y                        
TEMPORARY      VARCHAR2(1)   Y                        
GENERATED      VARCHAR2(1)   Y                        
SECONDARY      VARCHAR2(1)   Y                        
NAMESPACE      NUMBER        Y                        
EDITION_NAME   VARCHAR2(30)  Y

注意:

對於已有大量資料的表無法並行建立主鍵,可以先並行建立惟一性索引然後再加上主鍵。

主鍵不能為空,惟一性索引可以為空。

另外獲得的一個經驗教訓是:
我們知道oracle監聽關閉後新session無法連線,已經存在的session仍會繼續存活.當我關閉監聽要並行建立索引時提示有重複資料,於是去除重複資料。
納悶的是刪除完重複資料後即刻又出現了重複資料,只是數量較原來少.後來和同事溝通才恍然大悟。oracle監聽關閉原理都明白,真正應用到實踐中還是需要用心體察。最後,在關閉oracle監聽情況下重啟資料庫,再並行建立唯一索引,然後新增對應主鍵,問題終於得到解決.

    最後,本案例過程中涉及到的刪除重複資料請參見:http://blog.itpub.net/29119536/viewspace-1661040/
                                  主鍵與主鍵索引關係請參見:http://blog.itpub.net/29119536/viewspace-1661582/
 

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

相關文章