2012年5月17日星期四

interval分区和range分区的互相转换

  • INTERVAL分区其实是一种比较特殊的范围分区,因此可以很方便的将RANGE分区表转化为 INTERVAL分区表,同样可以将INTERVAL分区表转化为RANGE分区表。
  • 对于一个普通的范围分区表:
  • SQL> CREATE TABLE T_PART (ID NUMBER, NAME VARCHAR2(30), CREATE_DATE DATE)
  •  PARTITION BY RANGE (ID) 
  • (
  •   PARTITION P1 VALUES LESS THAN (100), 
  •   PARTITION P2 VALUES LESS THAN (200),
  •   PARTITION P3 VALUES LESS THAN (300)
  • );
  • 表已创建。
  • SQL> SELECT TABLE_NAME, PARTITIONING_TYPE, INTERVAL FROM USER_PART_TABLES WHERE TABLE_NAME = 'T_PART';
  • TABLE_NAME PARTITION INTERVAL
    ------------------------------ --------- ----------------------------------------
    T_PART RANGE
  • SQL> INSERT INTO T_PART VALUES (100, 'A', SYSDATE);
  • 已创建1行。
  • SQL> INSERT INTO T_PART VALUES (240, 'A', SYSDATE);
  • 已创建1行。
  • SQL> INSERT INTO T_PART VALUES (360, 'TEST', SYSDATE);
  • INSERT INTO T_PART
    *
    1行出现错误:
    ORA-14400:
    插入的分区关键字未映射到任何分区
    插入超过分区上限的记录会报错,下面通过一个简单ALTER TABLE语句,将RANGE分区表转化为INTERVAL分区表:
  • SQL> ALTER TABLE T_PART SET INTERVAL (100);
  • 表已更改。
  • SQL> SELECT TABLE_NAME, PARTITIONING_TYPE, INTERVAL FROM USER_PART_TABLES 
  • WHERE TABLE_NAME = 'T_PART';
  • TABLE_NAME PARTITION INTERVAL
    ------------------------------ --------- ----------------------------------------
    T_PART RANGE 100
  • SQL> INSERT INTO T_PART VALUES (360, 'TEST', SYSDATE);
  • 已创建1行。
  • SQL> COMMIT;
  • 提交完成。
  • SQL> SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = 'T_PART';
  • TABLE_NAME PARTITION_NAME HIGH_VALUE
    ------------------------------ ------------------------------ ----------------------
    T_PART P1 100
    T_PART P2 200
    T_PART P3 300
    T_PART SYS_P97 400
     
  • 对于INTERVAL分区表,新增的超过分区上限的数据会自动导致对应的INTERVAL分区被建立。同样INTERVAL分区表可以方便的转化为RANGE分区表,只需要不输入INTERVAL的值即可:
  •  
  • SQL> ALTER TABLE T_PART SET INTERVAL ();
  • 表已更改。
  • 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> INSERT INTO T_PART VALUES (450, 'B', SYSDATE);
    INSERT INTO T_PART
    *
    1行出现错误:
    ORA-14400:
    插入的分区关键字未映射到任何分区
  • 同时需要注意,不输入INTERVAL的值不等价于输入NULL
  • SQL> ALTER TABLE T_PART SET INTERVAL (NULL);
    ALTER TABLE T_PART SET INTERVAL (NULL)
    *
    1行出现错误:
    ORA-14752:
    间隔表达式不是正确类型的常数
  • 除了RANGE分区表和INTERVAL分区表之间可以相互转化,INTERVAL分区也可以转化为RANGE分区:
  • SQL> ALTER TABLE T_PART SET INTERVAL (100);
  • 表已更改。
  • SQL> SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE, INTERVAL FROM USER_TAB_PARTITIONS
  •  WHERE TABLE_NAME = 'T_PART';
  • TABLE_NAME PARTITION_NAME HIGH_VALUE INTERVAL
    ---------- --------------- ---------------------------------------- ----------------------
    T_PART P1 100 NO
    T_PART P2 200 NO
    T_PART P3 300 NO
    T_PART SYS_P97 400 NO
  • SQL> INSERT INTO T_PART VALUES (453, 'A', SYSDATE);
  • 已创建1行。
  • SQL> INSERT INTO T_PART VALUES (743, 'B', SYSDATE);
  • 已创建1行。
  • SQL> COMMIT;
  • 提交完成。
  • SQL> SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE, INTERVAL FROM USER_TAB_PARTITIONS
  •  WHERE TABLE_NAME = 'T_PART';
  • TABLE_NAME PARTITION_NAME HIGH_VALUE INTERVAL
    ---------- --------------- ---------------------------------------- --------------------
    T_PART P1 100 NO
    T_PART P2 200 NO
    T_PART P3 300 NO
    T_PART SYS_P97 400 NO
    T_PART SYS_P98 500 YES
    T_PART SYS_P99 800 YES
  • 已选择6行。
  • 除了MERGE PARTITIONSPLIT PARTITION之外,直接修改分区表为RANGE分区,也会使得所有现存的INTERVAL分区变成RANGE分区:
  • SQL> SELECT DBMS_METADATA.GET_DDL('TABLE', 'T_PART') FROM DUAL;
  • 取元数据不能看出有interval的信息。

没有评论:

发表评论