2011-10-31 68 views
3

我已經看到2種方法來更改主鍵。該方法如圖1所示,一些是在我刪除的主鍵(它刪除對應的索引爲好),然後與在它即更改主鍵

alter table TABLE_NAME drop constraint PK_TABLE_NAME drop index; 
alter table TABLE_NAME 
add constraint PK_TABLE_NAME PRIMARY KEY ("COL1") 
    USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
    STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 
      PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) 
    TABLESPACE "USERS" ENABLE; 
COMMIT; 
/

第二種方法是做的所有步驟indiviually創建一個新的索引中的主鍵即

alter table TABLE_NAME drop constraint PK_TABLE_NAME; 
drop index PK_TABLE_NAME; 

CREATE UNIQUE INDEX PK_TABLE_NAME ON TABLE_NAME 
(COL1) 
LOGGING 
TABLESPACE USERS 
PCTFREE 10 
INITRANS 2 
MAXTRANS 255 
STORAGE (
      INITIAL   64K 
      MINEXTENTS  1 
      MAXEXTENTS  UNLIMITED 
      PCTINCREASE  0 
      BUFFER_POOL  DEFAULT 
      FLASH_CACHE  DEFAULT 
      CELL_FLASH_CACHE DEFAULT 
      ) 
NOPARALLEL; 

alter table TABLE_NAME add constraint PK_TABLE_NAME PRIMARY KEY ("COL1") USING INDEX PK_TABLE_NAME; 
COMMIT; 
/

所以現在我的問題是

  1. 在這些2種方法已經除了事實步驟分裂任何東西在後端有什麼不同?
  2. 我看到我們可以提及列名即時引號,即「COL1」或不帶引號,即COL1。這兩種方法會有什麼不同嗎?
  3. 考慮這些步驟正在一個具有TRILLION OF DATA的表上執行,這些任何一個在其他上都有什麼性能增益?

回答

2

由於DDL與您的DDL完全相同,據我所知兩者之間沒有區別。 (這是基於比較select dbms_metadata.get_ddl('TABLE', 'TABLE_NAME') from dual;,一些簡單的性能測試,以及我以前處理這兩種方法的經驗。)

但是,如果您有數以萬億計的行或字節,那麼您應該使用並行性,然後有一個顯着差異。第一種方法不允許您並行創建索引(ORA-03001: unimplemented feature),但第二種方法可以。 即使您不希望索引平行,也應該並行創建它,然後將其更改爲noparallel。


至於雙引號,他們有什麼區別時,該列是所有大寫。但是,如果您使用混合大小寫,則表示該名稱區分大小寫,並且必須始終使用引號來引用該名稱。這真的很煩人,所以我通常刪除引號以防止意外創建區分大小寫的名稱。


其他一些說明。你可能要考慮使用NOLOGGING。而且不需要COMMIT;,DDL會自動提交提交。

+0

我喜歡在使用第二種方法創建索引時使用「並行」。 – pahariayogi