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

How do I alter my existing table to create a range partition in Oracle

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

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

我看到的大多数示例都是使用 CREATE TABLE..PARTITION BY RANGE... 添加新分区。但是我的 table 存在 table.

我想我需要一些 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. 保持每个分区只有一个月数据的正确语法是什么。

因为您的 table 未分区,您有两个选择:

  1. 导出数据,删除 table,创建新的分区 table,导入数据。
  2. 使用split then exchange分区方法。 https://oracle-base.com/articles/misc/partitioning-an-existing-table-using-exchange-partition

此外,如果您想要每月创建新分区,请阅读有关 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')));

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

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]);

db<>fiddle demo