如何更改现有表以在Oracle中创建范围分区

时间:2016-03-11 05:17:52

标签: oracle create-table alter-table partition

我有现有的表,有10年的数据(我已经转储)。

我想在表中的一个日期键列上对现有表进行Range分区。

我看到的大多数示例都带有CREATE TABLE..PARTITION BY RANGE...来添加新分区。但我的桌子是现有的桌子。

我认为我需要一些ALTER声明。

ALTER TABLE TABLE_NAME
PARTITION BY RANGE(CREATED_DATE)
 PARTITION JAN16 VALUES LESS THAN (01-02-2016),
 PARTITION FEB16 VALUES LESS THAN (01-03-2016) AND GREATER THAN(31-01-2016),//OR?
 PARTITION MAR16 VALUES BETWEEN (01-03-2016) AND (31-03-2016),  //OR?

两个问题..

  1. 我是否需要Alter语句来添加分区机制或需要使用create语句?

  2. 保持每个分区只有一个MONTH数据的正确语法是什么。

2 个答案:

答案 0 :(得分:2)

如果你的桌子没有分区,你有两个选择:

  1. 导出数据,删除表,创建新的patitioned表,导入数据。
  2. 使用split然后交换分区方法。 https://oracle-base.com/articles/misc/partitioning-an-existing-table-using-exchange-partition
  3. 另外,如果您希望每月新分区,请阅读SET INTERVAL。例如:

    CREATE TABLE tst
       (col_date DATE)
     PARTITION BY RANGE (col_date) INTERVAL (NUMTOYMINTERVAL(1, 'MONTH'))
    (PARTITION col_date_min VALUES LESS THAN (TO_DATE('2010-01-01', 'YYYY-MM-DD')));
    

答案 1 :(得分:2)

如果您使用的是Oracle 12c Release 2,则可以使用单ALTER将非分区表转换为分区表(这是单行程):

CREATE TABLE my_tab ( a NUMBER(38,0), b NUMBER(38,0)); 

ALTER TABLE MY_TAB MODIFY PARTITION BY RANGE (a) INTERVAL (1000) (   
    PARTITION p1 VALUES LESS THAN (1000)) ONLINE;

您也可以转换索引,添加:

update indexes (index_name [local/global]);