【问题标题】:Altering primary key更改主键
【发布时间】:2011-10-31 20:23:35
【问题描述】:

我见过两种改变主键的方法。方法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;
/

第二种方法是单独执行所有步骤,即

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. 我看到我们可以用引号提及列名,即 "COL1" 或不带引号,即 COL1。这两种方法会有什么不同吗?
  3. 考虑到这些步骤是在一个拥有万亿数据的表上执行的,这些步骤中的任何一个对其他的有任何性能提升吗?

【问题讨论】:

    标签: oracle plsql ddl


    【解决方案1】:

    DDL 与您完全一样,据我所知,两者之间没有区别。 (这是基于比较select dbms_metadata.get_ddl('TABLE', 'TABLE_NAME') from dual;、一些简单的性能测试以及我之前处理这两种方法的经验。)

    但是如果你有数万亿行或字节,那么你可能应该使用并行,然后有一个显着的区别。第一种方法不允许您并行创建索引 (ORA-03001: unimplemented feature),但第二种方法可以。 即使您不希望索引是并行的,您也应该并行创建它,然后使用 ALTER INDEX <index> NOPARALLEL; 之类的命令将其更改为 noparallel


    对于双引号,当列全部为大写时,它们没有区别。但是,如果您使用大小写混合,则意味着该名称区分大小写,您必须始终使用引号来引用该名称。这真的很烦人,所以我通常会删除引号以防止意外创建区分大小写的名称。


    其他一些注意事项。您可能要考虑使用 NOLOGGING。并且不需要COMMIT;,DDL 会自动导致提交。

    【讨论】:

    • 我喜欢在第二种方法中创建索引时使用“并行”。
    • PARALLEL 非常适合在非常大的表上创建索引,但请注意,它具有在索引上设置“并行”位的副作用。要在创建索引后撤消该操作,您需要 ALTER INDEX <index> NOPARALLEL;
    • @deleto 谢谢,我将您的代码 sn-p 添加到我的答案中。
    猜你喜欢
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 2020-09-01
    相关资源
    最近更新 更多