您的位置:首页 > 数据库 > Oracle

oracle范围分区表和INTERVAL分区表对于SPLIT分区的区别

2013-06-03 10:17 791 查看
范围分区表和INTERVAL分区表是可以相互转化的,不过二者还是有所区别的。比如在SPLIT分区的时候,范围分区表没有限制,而INTERVAL分区表则可能报错。

首先看范围分区的例子:

SQL> CREATE TABLE T_PART_RANGE

2 (ID NUMBER,

3 NAME VARCHAR2(30),

4 CREATE_DATE DATE)

5 PARTITION BY RANGE (CREATE_DATE)

6 (PARTITION P1 VALUES LESS THAN (TO_DATE('2009-1', 'YYYY-MM')),

7 PARTITION P2 VALUES LESS THAN (TO_DATE('2009-5', 'YYYY-MM')),

8 PARTITION P3 VALUES LESS THAN (TO_DATE('2009-9', 'YYYY-MM')));

表已创建。

SQL> ALTER TABLE T_PART_RANGE

2 SPLIT PARTITION P3

3 AT (TO_DATE('2009-7-30', 'YYYY-MM-DD'))

4 INTO (PARTITION P3, PARTITION P4);

表已更改。

SQL> SELECT PARTITION_NAME, HIGH_VALUE

2 FROM USER_TAB_PARTITIONS

3 WHERE TABLE_NAME = 'T_PART_RANGE'

4 ORDER BY 1;

PARTITION_NAME HIGH_VALUE

-------------- ----------------------------------------------------------------------------------

P1 TO_DATE(' 2009-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')

P2 TO_DATE(' 2009-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')

P3 TO_DATE(' 2009-07-30 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')

P4 TO_DATE(' 2009-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')

同样的操作,在INTERVAL分区表上执行就会报错:

SQL> CREATE TABLE T_PART_INTER

2 (ID NUMBER,

3 NAME VARCHAR2(30),

4 CREATE_DATE DATE)

5 PARTITION BY RANGE (CREATE_DATE)

6 INTERVAL (INTERVAL '4' MONTH)

7 (PARTITION P1 VALUES LESS THAN (TO_DATE('2009-1', 'YYYY-MM')),

8 PARTITION P2 VALUES LESS THAN (TO_DATE('2009-5', 'YYYY-MM')));

表已创建。

SQL> INSERT INTO T_PART_INTER

2 VALUES (1, 'TEST', TO_DATE('2009-8', 'YYYY-MM'));

已创建1行。

SQL> COMMIT;

提交完成。

SQL> SELECT PARTITION_NAME, HIGH_VALUE

2 FROM USER_TAB_PARTITIONS

3 WHERE TABLE_NAME = 'T_PART_INTER'

4 ORDER BY 1;

PARTITION_NAME HIGH_VALUE

-------------- ----------------------------------------------------------------------------------

P1 TO_DATE(' 2009-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')

P2 TO_DATE(' 2009-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')

SYS_P96 TO_DATE(' 2009-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')

SQL> ALTER TABLE T_PART_RANGE

2 SPLIT PARTITION FOR(TO_DATE('2009-8', 'YYYY-MM'))

3 AT (TO_DATE('2009-7-30', 'YYYY-MM-DD'))

4 INTO (PARTITION P3, PARTITION P4);

ALTER TABLE T_PART_RANGE

*

第1行出现错误:

ORA-14080:无法按指定的上限来分割分区

显然导致问题的原因是由于SPLIT分区操作后,INTERVAL分区会根据SPLIT的日期作为基准时间,在此基础上进行INTERVAL递增,因此大于28日的日志使用INTERVAL则会导致在2月的时候出错,所以Oracle禁止大于28日的日期作为INTERVAL MONTH的基础分区。

oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息