2016-10-14 169 views
4

我在现场制作环境中有一个Oracle表,并且该表的大小超过了一半。是否有可能将这个普通的Oracle表从堆组织到索引组织或只能通过将该表中的数据移动到另一个索引组织的新表来实现?无论哪种方式,如果您能请您列出此程序中涉及的步骤,我将不胜感激。将Oracle表移动到索引组织

回答

2

没有办法改变表使其成为索引组织表。相反,您可以重新定义表格(使用DBMS_REDEFINITION)或者可以使用CTAS创建新表格。

例子:

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

谢谢JSapkota。我在其他网站上看到了相同的评论,并且对如何使用DBMS_REDEFINITION包进行了更详细的阐述。例如,使用上面的同样的SQL,如何使用DBMS_REDEFINITION包,以便不必创建新的表t2,但是使用该包来转换t1。 – TS74

+0

您还需要创建具有新物理结构的新临时表(在这里您可以定义表的组织)来重新定义您的表及其相当长的过程。本文档链接提供了一些有用的示例:http://docs.oracle.com/cd/B28359_01/server.111/b28310/tables007.htm – JSapkota

+1

这是否可以在没有指定主键的情况下工作? IOT必须具有主键。 –

1

我从来没有使用过DBMS_REDEFINITION但CTAS它不是创建表,如果它是只生产工序。

  1. 列出所有索引,约束,外键等基于系统视图
  2. 准备创建索引,约束和改变外键的语句。准备触发器列表,依赖于表格的过程。
  3. (这一步之前考虑锁,如果你能)创建表作为选择
  4. 创建各项指标,与步骤2
  5. 交换表名和调剂外键预处理语句的约束(这一步可能会导致一些错误,如果你(如果你期望它在那个时候你应该锁定通过外键引用的表和表)
  6. 编译依赖对象从2(如果你锁定表在这里解锁)
  7. (如果你没有' t在步骤3上锁定)插入表select * from new minus select * from old;或者如果您有插入行的timstamp只插入新行

我希望列表是完整的。

相关问题