当前位置: 代码迷 >> 综合 >> 11g新特性之interval partition
  详细解决方案

11g新特性之interval partition

热度:7   发布时间:2023-12-08 18:58:02.0

Oracle10g中,创建范围分区表时,通常建议创建指定maxvalue值的分区,以避免由于插入值超出分区最大值范围而导致ora-14400错误的发生。

SQL> create table sales_normal
     ( sales_id number,
       sales_dt date)
     partition by range (sales_dt)
     ( partition p200901 values less than (to_date(‘2009-2-1′,’yyyy-mm-dd’)));

Table created.

SQL> insert into sales_normal values(1,’1-dec-09′);
insert into sales_normal values(1,’1-dec-09′)
            *
ERROR at line 1:
ORA-14400: inserted partition key does not map to any partition

SQL> alter table sales_normal
  2  add partition p_max values less than (maxvalue);

Table altered.

SQL> insert into sales_normal values(1,’1-dec-09′);

1 row created.

SQL> commit;

Commit complete.

Oracle11g中一种新的分区类型很好的解决了这个问题–interval partition,它是传统范围分区的扩展,使得分区表的使用和维护更加灵活。

SQL> create table sales
     ( sales_id number,
       sales_dt date)
     partition by range(sales_dt)
     interval (numtoyminterval (1,’month’))
     ( partition p200901 values less than (to_date(‘2009-2-1′,’yyyy-mm-dd’)));

Table created.

SQL> insert into sales values(1,’01-dec-09′);

1 row created.

SQL> commit;

Commit complete.

SQL> select * from sales;

  SALES_ID SALES_DT
———- ———
         1 01-DEC-09

可以看出,虽然2009-12-1超出分区最大值2009-2-1的范围,插入操作并没有报错。那么对于这种数据,Oracle是怎么处理的呢?我们看看user_tab_partitoins视图就知道其中的奥秘。

SQL> select partition_name,high_value from user_tab_partitions
  2  where table_name=’SALES’;

PARTITION_ HIGH_VALUE
———- ——————————————————————————–
P200901    TO_DATE(‘ 2009-02-01 00:00:00′, ‘SYYYY-MM-DD HH24:MI:SS’, ‘NLS_CALENDAR=GREGORIA
SYS_P21    TO_DATE(‘ 2010-01-01 00:00:00′, ‘SYYYY-MM-DD HH24:MI:SS’, ‘NLS_CALENDAR=GREGORIA

当插入的数值超出表分区范围的最大值时,系统动态创建能够满足插入值的表分区,保存插入的数据。这里的SYS_P21就是Oracle系统自动产生,分区的最大值为2010-01-01。

  相关解决方案