将Oracle表移动到正在编制索引的位置

将Oracle表移动到正在编制索引的位置,oracle,Oracle,我在实时生产环境中有一个Oracle表,该表的大小超过了半GB。是否可以将此普通Oracle表从堆组织更改为索引组织,或者仅通过将此表中的数据移动到另一个索引组织的新表来实现?无论哪种方式,如果您能列出此过程中涉及的步骤,我将不胜感激。无法更改表格使其成为索引组织的表格。相反,您可以重新定义表(使用),也可以使用CTA创建新表 例如: create table t2 ( id number, first_name varchar2(20), constraint pk_id primary

我在实时生产环境中有一个Oracle表,该表的大小超过了半GB。是否可以将此普通Oracle表从堆组织更改为索引组织,或者仅通过将此表中的数据移动到另一个索引组织的新表来实现?无论哪种方式,如果您能列出此过程中涉及的步骤,我将不胜感激。

无法更改表格使其成为索引组织的表格。相反,您可以重新定义表(使用),也可以使用CTA创建新表

例如:

 create table t2 (
 id number, first_name varchar2(20),
 constraint pk_id primary key (id)
 )
 organization index
 as select * from t1;

我从未使用过
DBMS\u重新定义
,但使用CTAS时,若表是生产的,那个么它并不是创建表的唯一步骤

  • 基于系统视图列出所有索引、约束、外键等
  • 准备创建索引、约束和更改外键语句。准备触发器列表和依赖于表的程序
  • 按select创建表(如果可以,请考虑在该步骤之前锁定)
  • 使用步骤2中准备好的语句创建所有索引和约束
  • 交换表名和交换外键(如果在外键上按insert键,则此步骤可能会导致一些错误(如果您希望在此时使用insert键,则应锁定表和按外键引用的表)
  • 从2编译依赖对象(如果您在此处锁定了表,请在此处解锁)
  • (如果您没有锁定步骤3)将插入表
    select*from new减去select*from old;
    或者如果您有插入行的标记,只需插入新行即可

  • 我希望列表是完整的。

    谢谢JSapkota。我在其他网站上看到了相同的评论,并且对如何使用DBMS_重新定义包有兴趣。例如,使用上面相同的SQL,如何使用DBMS_重新定义包,这样就不必创建新表t2,但t1是转换的您还需要使用新的物理结构创建新的临时表(在这里您可以定义表的组织)重新定义您的表及其相当长的过程。此文档链接提供了一些有用的示例:在不指定主键的情况下此操作有效吗?IOT必须有主键。@TS74-使用
    dbms\u重新定义
    仍然需要您创建一个新表
    t2
    ,移动数据,然后进行重命名。这是什么意思然而,软件包确实允许您这样做(大多数情况下)通过使用其他技术在线跟踪旧表上的更改,以便将更改应用到新表上,从而最大限度地减少停机时间。您可以使用物化视图和MV日志自己做同样的事情,但是
    dbms\u重新定义
    是一个很好的抽象层,因此您不必考虑所有这些内部问题s