使用新的子分区模板在 Oracle 中拆分 maxvalue 分区

Posted

技术标签:

【中文标题】使用新的子分区模板在 Oracle 中拆分 maxvalue 分区【英文标题】:Split maxvalue partition in Oracle with new subpartition template 【发布时间】:2020-03-03 05:06:15 【问题描述】:

如何在 Oracle 中使用新的子分区模板拆分 maxvalue 分区。

或者

如何在 Oracle 中拆分 maxvalue 分区并同时添加新的子分区

【问题讨论】:

【参考方案1】:

您可以使用SPLIT PARTITION,如下:

Oracle 设置:

SQL> CREATE TABLE PART_EXAMPLE (
  2      ID             NUMBER,
  3      CREATED_DATE   DATE
  4  )
  5      PARTITION BY RANGE (
  6          CREATED_DATE
  7      )
  8      ( PARTITION T1_2019
  9          VALUES LESS THAN ( MAXVALUE )
 10      );

Table created.

检查分区:

SQL> SELECT
  2      TABLE_NAME,
  3      PARTITION_NAME
  4  FROM
  5      USER_TAB_PARTITIONS
  6  WHERE TABLE_NAME = 'PART_EXAMPLE';

TABLE_NAME      PARTITION_
--------------- ----------
PART_EXAMPLE    T1_2019

将分区一分为二:

SQL> ALTER TABLE PART_EXAMPLE
  2    SPLIT PARTITION T1_2019 AT (TO_DATE('31-DEC-2017 23:59:59', 'DD-MON-YYYY HH24:MI:SS'))
  3    INTO (PARTITION T1_2017, PARTITION T1_2019)
  4    ONLINE;

Table altered.

现在,检查分区:

SQL> SELECT
  2      TABLE_NAME,
  3      PARTITION_NAME
  4  FROM
  5      USER_TAB_PARTITIONS
  6  WHERE TABLE_NAME = 'PART_EXAMPLE';

TABLE_NAME      PARTITION_
--------------- ----------
PART_EXAMPLE    T1_2017
PART_EXAMPLE    T1_2019

SQL>

我希望它很清楚。

干杯!!

【讨论】:

【参考方案2】:

您可以为表设置子分区模板。但这只会影响新分区。它对现有分区没有影响:

create table t (
  c1 int, c2 int
) partition by range ( c1 ) 
  subpartition by hash ( c2 )
  subpartition template 2 
  (
    partition p0 values less than ( 1 ),
    partition pmax values less than ( maxvalue )
  );

select partition_name, subpartition_name
from   user_tab_subpartitions
where  table_name = 'T';

PARTITION_NAME    SUBPARTITION_NAME   
P0                SYS_SUBP2922         
P0                SYS_SUBP2923         
PMAX              SYS_SUBP2924         
PMAX              SYS_SUBP2925   

alter table t 
  set subpartition template 1;

select partition_name, subpartition_name
from   user_tab_subpartitions
where  table_name = 'T';

PARTITION_NAME    SUBPARTITION_NAME   
P0                SYS_SUBP2922         
P0                SYS_SUBP2923         
PMAX              SYS_SUBP2924         
PMAX              SYS_SUBP2925  

您也可以在拆分时设置模板。但同样,这不会影响现有分区:

alter table t 
  split partition pmax at ( 2 )
  into ( 
    partition p1 set subpartition template 1, 
    partition pmax set subpartition template 1
  );

select partition_name, subpartition_name
from   user_tab_subpartitions
where  table_name = 'T';

PARTITION_NAME    SUBPARTITION_NAME   
P0                SYS_SUBP2922         
P0                SYS_SUBP2923         
P1                SYS_SUBP2926         
P1                SYS_SUBP2927         
PMAX              SYS_SUBP2924         
PMAX              SYS_SUBP2925  

如果要在拆分分区时更改子分区,请在 subpartitions 子句中定义它们:

alter table t 
  split partition pmax at ( 3 )
  into ( 
    partition p2 subpartitions 1, 
    partition pmax subpartitions 4
  );

select partition_name, subpartition_name
from   user_tab_subpartitions
where  table_name = 'T';

PARTITION_NAME    SUBPARTITION_NAME   
P0                SYS_SUBP2936         
P0                SYS_SUBP2937         
P1                SYS_SUBP2940         
P1                SYS_SUBP2941         
P2                SYS_SUBP2942         
PMAX              SYS_SUBP2943         
PMAX              SYS_SUBP2944         
PMAX              SYS_SUBP2945         
PMAX              SYS_SUBP2946 

【讨论】:

以上是关于使用新的子分区模板在 Oracle 中拆分 maxvalue 分区的主要内容,如果未能解决你的问题,请参考以下文章

通过动态增加拆分在 oracle 中创建拆分分区

html模板django python中带有拆分的子字符串

在 Oracle 中使用和不使用 KEEP 进行分区

Oracle partition table 分区表详解

创建分区表 以及拆分分区表(修改分区)

数据库分区 - 水平与垂直 - 规范化和行拆分之间的区别?