oracle范围分区合并,Oracle范围分区表和INTERVAL分区表相互转化

INTERVAL分区其实是一种比较特殊的范围分区,因此可以很方便的将RANGE分区表转化为INTERVAL分区表,同样可以将INTERVAL分区表转化为RANGE分区表。

对于一个普通的范围分区表:

SQL> CREATE TABLE T_PART

2  (ID NUMBER,

3  NAME VARCHAR2(30),

4  CREATE_DATE DATE)

5  PARTITION BY RANGE (ID)

6  (PARTITION P1 VALUES LESS THAN (100),

7  PARTITION P2 VALUES LESS THAN (200),

8  PARTITION P3 VALUES LESS THAN (300));

表已创建。

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

2  VALUES (100, 'A', SYSDATE);

已创建1行。

SQL> INSERT INTO T_PART

2  VALUES (240, 'A', SYSDATE);

已创建1行。

SQL> INSERT INTO T_PART

2  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

2  FROM USER_PART_TABLES

3  WHERE TABLE_NAME = 'T_PART';

TABLE_NAME                     PARTITION INTERVAL

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

T_PART                         RANGE     100

SQL> INSERT INTO T_PART

2  VALUES (360, 'TEST', SYSDATE);

已创建1行。

SQL> COMMIT;

提交完成。

SQL> SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE

2  FROM USER_TAB_PARTITIONS

3  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

2  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

2  FROM USER_TAB_PARTITIONS

3  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

2  VALUES (453, 'A', SYSDATE);

已创建1行。

SQL> INSERT INTO T_PART

2  VALUES (743, 'B', SYSDATE);

已创建1行。

SQL> COMMIT;

提交完成。

SQL> SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE, INTERVAL

2  FROM USER_TAB_PARTITIONS

3  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 PARTITION、SPLIT PARTITION之外,直接修改分区表为RANGE分区,也会使得所有现存的INTERVAL分区变成RANGE分区:

SQL> SELECT DBMS_METADATA.GET_DDL('TABLE', 'T_PART')

2  FROM DUAL;

DBMS_METADATA.GET_DDL('TABLE','T_PART')

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

CREATE TABLE "YANGTK"."T_PART"

(    "ID" NUMBER,

"NAME" VARCHAR2(30),

"CREATE_DATE" DATE

) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255

STORAGE(

BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)

TABLESPACE "YANGTK"

PARTITION BY RANGE ("ID") INTERVAL (100)

(PARTITION "P1"  VALUES LESS THAN (100)

PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255

STORAGE(INITIAL 81920 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645

PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE

DEFAULT)

TABLESPACE "YANGTK" NOCOMPRESS ,

PARTITION "P2"  VALUES LESS THAN (200)

PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255

STORAGE(INITIAL 81920 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645

PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)

TABLESPACE "YANGTK" NOCOMPRESS ,

PARTITION "P3"  VALUES LESS THAN (300)

PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255

STORAGE(INITIAL 81920 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645

PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFA

ULT CELL_FLASH_CACHE DEFAULT)

TABLESPACE "YANGTK" NOCOMPRESS ,

PARTITION "SYS_P97"  VALUES LESS THAN (400)

PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255

STORAGE(INITIAL 81920 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645

PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT C

ELL_FLASH_CACHE DEFAULT)

TABLESPACE "YANGTK" NOCOMPRESS )

SQL> ALTER TABLE T_PART SET INTERVAL ();

表已更改。

SQL> SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE, INTERVAL

2  FROM USER_TAB_PARTITIONS

3  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                                      NO

T_PART     SYS_P99         800                                      NO

已选择6行。

SQL> SELECT DBMS_METADATA.GET_DDL('TABLE', 'T_PART')

2  FROM DUAL;

DBMS_METADATA.GET_DDL('TABLE','T_PART')

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

CREATE TABLE "YANGTK"."T_PART"

(    "ID" NUMBER,

"NAME" VARCHAR2(30),

"CREATE_DATE" DATE

) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255

STORAGE(

BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)

TABLESPACE "YANGTK"

PARTITION BY RANGE ("ID")

(PARTITION "P1"  VALUES LESS THAN (100)

PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255

STORAGE(INITIAL 81920 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645

PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)

TABLESPACE "YANGTK" NOCOMPRESS ,

PARTITION "P2"  VALUES LESS THAN (200)

PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255

STORAGE(INITIAL 81920 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645

PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT C

ELL_FLASH_CACHE DEFAULT)

TABLESPACE "YANGTK" NOCOMPRESS ,

PARTITION "P3"  VALUES LESS THAN (300)

PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255

STORAGE(INITIAL 81920 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645

PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_

CACHE DEFAULT)

TABLESPACE "YANGTK" NOCOMPRESS ,

PARTITION "SYS_P97"  VALUES LESS THAN (400)

PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255

STORAGE(INITIAL 81920 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645

PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE

DEFAULT)

TABLESPACE "YANGTK" NOCOMPRESS ,

PARTITION "SYS_P98"  VALUES LESS THAN (500)

PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255

STORAGE(INITIAL 81920 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645

PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFA

ULT)

TABLESPACE "YANGTK" NOCOMPRESS ,

PARTITION "SYS_P99"  VALUES LESS THAN (800)

PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255

STORAGE(INITIAL 81920 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645

PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)

TABLESPACE "YANGTK" NOCOMPRESS )

需要注意,INTERVAL分区在DBMS_METADATA获取的表结构中并不会出现,一旦转化为RANGE分区,则DBMS_METADATA获取的源数据会包括分区信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle数据库分区表可以使用分区自动命名功能,这可以帮助我们更方便地管理和维护分区表分区自动命名是指Oracle数据库根据预定义的模式自动为新分区命名。 在创建分区表时,我们可以指定分区模式。分区模式是一个包含占位符的字符串,用于指定如何为每个新分区命名。在分区表中,占位符将被替换为实际值。 例如,以下是一个使用时间作为分区键的分区表的示例: ``` CREATE TABLE sales ( sales_id NUMBER(10), sales_date DATE, amount NUMBER(10) ) PARTITION BY RANGE (sales_date) INTERVAL(NUMTOYMINTERVAL(1,'MONTH')) ( PARTITION p1 VALUES LESS THAN (TO_DATE('01-01-2017','DD-MM-YYYY')), PARTITION p2 VALUES LESS THAN (TO_DATE('01-02-2017','DD-MM-YYYY')), PARTITION p3 VALUES LESS THAN (TO_DATE('01-03-2017','DD-MM-YYYY')), PARTITION p4 VALUES LESS THAN (MAXVALUE) ); ``` 在这个例子中,我们使用了INTERVAL关键字来指定每个新分区的时间间隔。这样,在每个时间间隔结束时,Oracle数据库将自动为我们创建一个新分区。我们还使用了分区模式来指定新分区的命名方式: ``` PARTITION p1 VALUES LESS THAN (TO_DATE('01-01-2017','DD-MM-YYYY')) ``` 在这个示例中,我们使用了TO_DATE函数来指定日期,并使用了占位符“YYYY_MM”来指定新分区的名称格式。因此,第一个分区的名称将是“P_2017_01”。 如果我们希望使用其他的占位符或更复杂的命名方式,可以根据需要修改分区模式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值