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
首先看范围分区的例子:
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
相关文章推荐
- Oracle--分区表(范围分区、Hash分区、等)
- 浅谈Oracle分区表之范围分区
- oracle范围分区表和INTERVAL分区表相互转化
- 浅谈Oracle分区表之范围分区
- oracle超大数据库表分区只复合分区表(范围散列分区表)
- Oracle--分区表(范围分区、Hash分区、等)
- oracle 11g分区表新特性---interval分区 的坑
- Oracle将已有数据的表改为分区表【创建表分区、索引分区】
- (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
- ORACLE分区表、分区索引详解
- oracle Interval 分区维护与管理要点
- oracle分区之包含模板的'范围-列表分区'例子
- Oracle用分区表分区交换做历史数据迁移
- 深入学习Oracle分区表及分区索引
- 深入学习Oracle分区表及分区索引
- 深入学习Oracle分区表及分区索引(1)
- Oracle 11G的间隔(INTERVAL)分区
- 分区表 主键全局索引和分区索引区别
- 关于oracle 11G 分区表新特性Interval
- 2010年8月9日——oracle定时添加或删除分区表的分区