【问题标题】:How to add interval partitions to an existing table in Oracle如何在 Oracle 中将间隔分区添加到现有表中
【发布时间】:2014-10-19 20:50:21
【问题描述】:

我有这样的场景,我需要为 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" ) 

【问题讨论】:

  • 你有试过的代码吗?有的话请发帖
  • 请不要在 cmets 中发布其他信息 - 改为编辑您的问题(使用“编辑”按钮)。
  • 最近类似的问题,有详细的答案:stackoverflow.com/questions/35932771/…

标签: oracle11g


【解决方案1】:

您不能对现有的未分区表进行分区。

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

【讨论】:

    【解决方案2】:

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

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

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

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

    3) 备份用于创建索引、约束、授权、触发器的脚本。

    4) 删除表 RSST_TP_ORDERINVOICED_NETREV_F。

    5) 将表 RSST_TP_ORDERINVOICED_NETREV_F_TEMP 重命名为 RSST_TP_ORDERINVOICED_NETREV_F。

    6)重新创建所有对应的索引、约束(主键、外键)、授权、触发器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-10
      • 2019-09-06
      • 2017-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多