我有一些方案,我需要为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" )
答案 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)重新创建所有相应的索引,约束(主键,外键),授予,触发器。