如何更改我现有的 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?
两个问题..
我需要Alter语句来添加分区机制还是需要使用create语句?
保持每个分区只有一个月数据的正确语法是什么。
因为您的 table 未分区,您有两个选择:
- 导出数据,删除 table,创建新的分区 table,导入数据。
- 使用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]);
我有现有的 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?
两个问题..
我需要Alter语句来添加分区机制还是需要使用create语句?
保持每个分区只有一个月数据的正确语法是什么。
因为您的 table 未分区,您有两个选择:
- 导出数据,删除 table,创建新的分区 table,导入数据。
- 使用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]);