开始研究INTERVAL分区的时候只是了解了个大概,这次看分区的文档对INTERVAL分区又多了一些了解。
11G新增的INTERVAL分区使得手工给RANGE分区添加新分区的工作变得异常简单,这也使得INTERVAL分区成为RANGE分区的最佳选择。
更方便的是,INTERVAL分区并非必须在表创建的时候指定,即使RANGE分区表已经建立,也可以修改为使其变为INTERVAL分区:
SQL> CREATE TABLE T_PART
2 (ID NUMBER,
3 NAME VARCHAR2(30),
4 CREATE_TIME DATE)
5 PARTITION BY RANGE (CREATE_TIME)
6 (PARTITION P1 VALUES LESS THAN (TO_DATE('2008-1', 'YYYY-MM')),
7 PARTITION P2 VALUES LESS THAN (TO_DATE('2009-1', 'YYYY-MM')));
表已创建。
SQL> COL INTERVAL FORMAT A20
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> ALTER TABLE T_PART SET INTERVAL (INTERVAL '1' YEAR);
表已更改。
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 INTERVAL'1'YEAR
SQL> SET LONG 10000
SQL> SELECT DBMS_METADATA.GET_DDL('TABLE', 'T_PART')
2 FROM DUAL;
DBMS_METADATA.GET_DDL('TABLE','T_PART')
--------------------------------------------------------------------------------
CREATE TABLE "TEST"."T_PART"
( "ID" NUMBER,
"NAME" VARCHAR2(30),
"CREATE_TIME" DATE
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
STORAGE(
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS"
PARTITION BY RANGE ("CREATE_TIME") INTERVAL (INTERVAL'1'YEAR)
(PARTITION "P1" VALUES LESS THAN (TO_DATE(' 2008-01-01 00:00:00', 'SYYYY-MM-DD HH24:M
I:SS', 'NLS_CALENDAR=GREGORIAN'))
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
STORAGE(INITIAL 81920 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAUL
T CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" NOCOMPRESS ,
PARTITION "P2" VALUES LESS THAN (TO_DATE(' 2009-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS
_CALENDAR=GREGORIAN'))
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
STORAGE(INITIAL 81920 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLAS
H_CACHE DEFAULT)
TABLESPACE "USERS" NOCOMPRESS )
SQL> INSERT INTO T_PART
2 VALUES (1, 'TEST', SYSDATE);
已创建 1 行。
这使得现有的所有RANGE分区表都可以利用INTERVAL分区的优点,而且INTERVAL方式分区也支持复合分区,INTERVAL-HASH、INTERVAL-LIST和INTERVAL-RANGE三种分区方式都是支持的,唯一需要注意的是,由于INTERVAL的分区是根据需要自动创建,因此需要使用子分区模板来确定新增分区的子分区如何建立,如果没有建立子分区模板,则新增的分区只会包含一个子分区。
INTERVAL分区的另一个特点就是不允许分区键值为空值:
SQL> INSERT INTO T_PART
2 VALUES (2, 'NULL', NULL);
INSERT INTO T_PART
*
第 1 行出现错误:
ORA-14400: 插入的分区关键字未映射到任何分区
这个限制其实也很好理解,由于INTERVAL分区不存在MAXVALUE分区,因此NULL值“大于”所有的分区键值。
如果分区键值可能为空,那么INTERVAL分区就不适用,不过分区键值为空的情况本身就十分罕见。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-627426/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/4227/viewspace-627426/