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

范围分区表和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的基础分区。

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-628939/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/4227/viewspace-628939/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值