如何将间隔分区添加到Oracle中的现有表

时间:2014-08-26 13:42:09

标签: oracle11g

我有一些方案,我需要为Oracle中没有分区的现有表创建间隔分区(每月)。请告诉我如何继续。

我试过下面的

alter table RSST_TP_ORDERINVOICED_NETREV_F 
  set interval(NUMTOYMINTERVAL(1,'MONTH')); 
TABLESPACE "RSST_DATA" 
  PARTITION BY RANGE ( "DATE_SK" ) 
  INTERVAL ( NUMTOYMINTERVAL(1,'MONTH') ) ( 
PARTITION "P_FIRST" VALUES LESS THAN (TO_DATE(' 2000-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) 
TABLESPACE "RSST_DATA" ) 

2 个答案:

答案 0 :(得分:1)

您无法对现有的非分区表进行分区。

通常,您需要创建一个新的分区表,将数据从现有表移动到新表(可能使用带有并行DML的直接路径插入),删除旧表,然后重命名新表表使用旧名称。你可以手动完成。或者您可以使用dbms_redefinition包来管理这些步骤 - 效率可能会降低,但它可以让您在没有中断窗口的情况下执行此操作。

答案 1 :(得分:1)

如上所述,我们不能使用alter命令(Oracle 11g及更低版本)直接对现有的未分区表进行分区。

1)创建带有分区(结构相似)的新表“ RSST_TP_ORDERINVOICED_NETREV_F_TEMP”。

2)将整个数据从RSST_TP_ORDERINVOICED_NETREV_F插入到RSST_TP_ORDERINVOICED_NETREV_F_TEMP

使用:INSERT / * +追加* / INTO RSST_TP_ORDERINVOICED_NETREV_F_TEMP AS SELECT * FROM RSST_TP_ORDERINVOICED_NETREV_F;或批量收集

3)备份脚本以创建索引,约束,gr,触发。

4)删除表RSST_TP_ORDERINVOICED_NETREV_F。

5)将表RSST_TP_ORDERINVOICED_NETREV_F_TEMP重命名为RSST_TP_ORDERINVOICED_NETREV_F。

6)重新创建所有相应的索引,约束(主键,外键),授予,触发器。