Oracle 12c 新特性 --- 将非分区表在线转换到分区表
可以将非分区表转换为在线分区表。索引作为该操作的一部分被维护,也可以被分区。转换对正在进行的DML操作没有影响。
--限制:
. 有一些与此功能相关的限制。
. 它不能被用来分割一个索引有序的表(IOT)。
. 如果表有域索引,就不能使用它。
. 您只能在脱机模式下将表转换为reference-partitioned子表。
--实验:
--1.创建表并插入数据,创建索引
drop table t1;
CREATE TABLE t1 (
id NUMBER,
description VARCHAR2(50),
created_date DATE,
CONSTRAINT t1_pk PRIMARY KEY (id)
);
CREATE INDEX t1_created_date_idx ON t1(created_date);
CREATE INDEX t1_description ON t1(description);
INSERT INTO t1
SELECT level,
'Description for ' || level,
ADD_MONTHS(TO_DATE('01-JAN-2017', 'DD-MON-YYYY'), -TRUNC(DBMS_RANDOM.value(1,4)-1)*12)
FROM dual
CONNECT BY level <= 1000;
COMMIT;
--2 我们可以看到数据被分配在3个时间段内。
SELECT created_date, COUNT(*) FROM t1 GROUP BY created_date ORDER BY 1;
CREATED_DATE COUNT(*)
------------ ----------
01-JAN-15 322
01-JAN-16 355
01-JAN-17 323
--3 分区表 我们可以使用ALTER TABLE ... MODIFY将表转换为分区表。下面是这个操作的一些基本示例。添加online关键字允许在线完成操作。
--3.1 基本的离线操作。
ALTER TABLE t1 MODIFY
PARTITION BY RANGE (created_date) (
PARTITION t1_part_2015 VALUES LESS THAN (TO_DATE('01-JAN-2016','DD-MON-YYYY')),
PARTITION t1_part_2016 VALUES LESS THAN (TO_DATE('01-JAN-2017','DD-MON-YYYY')),
PARTITION t1_part_2017 VALUES LESS THAN (TO_DATE('01-JAN-2018','DD-MON-YYYY'))
);
COLUMN table_name FORMAT A20
COLUMN partition_name FORMAT A20
SELECT table_name, partition_name FROM user_tab_partitions where TABLE_NAME ='T1' ORDER BY 1,2;
TABLE_NAME PARTITION_NAME
-------------------- --------------------
T1 T1_PART_2015
T1 T1_PART_2016
T1 T1_PART_2017
--检查转分区之后,索引状态
col index_name for a30
select index_name,status from user_indexes where index_name in ('T1_PK','T1_CREATED_DATE_IDX','T1_DESCRIPTION');
INDEX_NAME STATUS
------------------------------ --------
T1_CREATED_DATE_IDX
Oracle 12c 新特性 --- 将非分区表在线转换到分区表
最新推荐文章于 2023-04-15 22:23:20 发布
![](https://img-home.csdnimg.cn/images/20240709112858.png)