2011-10-31 73 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