- INTERVAL分区其实是一种比较特殊的范围分区,因此可以很方便的将RANGE分区表转化为 INTERVAL分区表,同样可以将INTERVAL分区表转化为RANGE分区表。
- 对于一个普通的范围分区表:
- SQL> CREATE TABLE T_PART (ID NUMBER, NAME VARCHAR2(30), CREATE_DATE DATE)
- PARTITION BY RANGE (ID)
- (
- PARTITION P1 VALUES LESS THAN (100),
- PARTITION P2 VALUES LESS THAN (200),
- PARTITION P3 VALUES LESS THAN (300)
- );
- 表已创建。
- SQL> SELECT TABLE_NAME, PARTITIONING_TYPE, INTERVAL FROM USER_PART_TABLES WHERE TABLE_NAME = 'T_PART';
- TABLE_NAME PARTITION INTERVAL
------------------------------ --------- ----------------------------------------
T_PART RANGE - SQL> INSERT INTO T_PART VALUES (100, 'A', SYSDATE);
- 已创建1行。
- SQL> INSERT INTO T_PART VALUES (240, 'A', SYSDATE);
- 已创建1行。
- SQL> INSERT INTO T_PART VALUES (360, 'TEST', SYSDATE);
- INSERT INTO T_PART
*第1行出现错误:
ORA-14400:插入的分区关键字未映射到任何分区插入超过分区上限的记录会报错,下面通过一个简单ALTER TABLE语句,将RANGE分区表转化为INTERVAL分区表: - SQL> ALTER TABLE T_PART SET INTERVAL (100);
- 表已更改。
- SQL> SELECT TABLE_NAME, PARTITIONING_TYPE, INTERVAL FROM USER_PART_TABLES
- WHERE TABLE_NAME = 'T_PART';
- TABLE_NAME PARTITION INTERVAL
------------------------------ --------- ----------------------------------------
T_PART RANGE 100 - SQL> INSERT INTO T_PART VALUES (360, 'TEST', SYSDATE);
- 已创建1行。
- SQL> COMMIT;
- 提交完成。
- SQL> SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = 'T_PART';
- TABLE_NAME PARTITION_NAME HIGH_VALUE
------------------------------ ------------------------------ ----------------------
T_PART P1 100
T_PART P2 200
T_PART P3 300
T_PART SYS_P97 400 - 对于INTERVAL分区表,新增的超过分区上限的数据会自动导致对应的INTERVAL分区被建立。同样INTERVAL分区表可以方便的转化为RANGE分区表,只需要不输入INTERVAL的值即可:
- SQL> ALTER TABLE T_PART SET INTERVAL ();
- 表已更改。
- SQL> SELECT TABLE_NAME, PARTITIONING_TYPE, INTERVAL
2 FROM USER_PART_TABLES
3 WHERE TABLE_NAME = 'T_PART'; - TABLE_NAME PARTITION INTERVAL
------------------------------ --------- ----------------------------------------
T_PART RANGE - SQL> INSERT INTO T_PART VALUES (450, 'B', SYSDATE);
INSERT INTO T_PART
*第1行出现错误:
ORA-14400:插入的分区关键字未映射到任何分区 - 同时需要注意,不输入INTERVAL的值不等价于输入NULL:
- SQL> ALTER TABLE T_PART SET INTERVAL (NULL);
ALTER TABLE T_PART SET INTERVAL (NULL)
*第1行出现错误:
ORA-14752:间隔表达式不是正确类型的常数 - 除了RANGE分区表和INTERVAL分区表之间可以相互转化,INTERVAL分区也可以转化为RANGE分区:
- SQL> ALTER TABLE T_PART SET INTERVAL (100);
- 表已更改。
- SQL> SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE, INTERVAL FROM USER_TAB_PARTITIONS
- WHERE TABLE_NAME = 'T_PART';
- TABLE_NAME PARTITION_NAME HIGH_VALUE INTERVAL
---------- --------------- ---------------------------------------- ----------------------
T_PART P1 100 NO
T_PART P2 200 NO
T_PART P3 300 NO
T_PART SYS_P97 400 NO - SQL> INSERT INTO T_PART VALUES (453, 'A', SYSDATE);
- 已创建1行。
- SQL> INSERT INTO T_PART VALUES (743, 'B', SYSDATE);
- 已创建1行。
- SQL> COMMIT;
- 提交完成。
- SQL> SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE, INTERVAL FROM USER_TAB_PARTITIONS
- WHERE TABLE_NAME = 'T_PART';
- TABLE_NAME PARTITION_NAME HIGH_VALUE INTERVAL
---------- --------------- ---------------------------------------- --------------------
T_PART P1 100 NO
T_PART P2 200 NO
T_PART P3 300 NO
T_PART SYS_P97 400 NO
T_PART SYS_P98 500 YES
T_PART SYS_P99 800 YES - 已选择6行。
- 除了MERGE PARTITION、SPLIT PARTITION之外,直接修改分区表为RANGE分区,也会使得所有现存的INTERVAL分区变成RANGE分区:
- SQL> SELECT DBMS_METADATA.GET_DDL('TABLE', 'T_PART') FROM DUAL;
- 取元数据不能看出有interval的信息。
2012年5月17日星期四
interval分区和range分区的互相转换
订阅:
博文评论 (Atom)
没有评论:
发表评论