使用 alter sub-partition template 不会自动创建 Oracle 间隔分区

Oracle interval partitions are not created automatically with alter sub-partition template

我正在使用 oracle 12c 间隔分区。我创建了 range partition1 month intervallist sub-partition 使用唯一标识符(比方说 LOGIN_INTFID)。

在 table DDL 中,我添加了创建 table 时已知的子分区列表。这是 table DDL 的摘录:

CREATE TABLE TEST
(
    UNIQUE_ID   NUMBER(9) NOT NULL,
    LOGIN_INTFID    VARCHAR2(20) NOT NULL,
    LOGIN_SEQNO NUMBER(15) NOT NULL,
    LOGIN_DATE DATE DEFAULT SYSDATE NOT NULL
)
PARTITION BY RANGE (LOGIN_DATE)
INTERVAL (NUMTOYMINTERVAL(1,'MONTH'))
SUBPARTITION BY LIST (LOGIN_INTFID) SUBPARTITION TEMPLATE (
SUBPARTITION SP1 VALUES ('ABC'),
SUBPARTITION SP2 VALUES ('DEF'),
)
(PARTITION TEST_Y2018M7D1  VALUES LESS 
THAN (TO_DATE('2018-07-01 23:59:59', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')))
;

至此,新分区和子分区创建成功。后来,我使用以下 alter 命令添加了一个子分区:

ALTER TABLE TEST modify partition SYS_P7068 add subpartition SP3 values ('XYZ');

我还更改了 table TEST,目的是下次创建新分区时,这个新的子分区会自动包含在 table 中:

ALTER TABLE TEST SET SUBPARTITION TEMPLATE (SUBPARTITION SP3 VALUES('XYZ'));

但是,这最后一部分没有按预期工作。当我尝试插入包含 XYZ 子分区值的数据时,没有创建新分区。仅当插入子分区值 ABC/DEF 时才会创建新分区。

我做错了什么?

您不能向模板添加新的子分区

documetation 所述:

You can modify a subpartition template of a composite partitioned table by replacing it with a new subpartition template.

您必须定义一个由新旧子分区组成的新模板。

这对尚未创建的分区有效,对于现有分区,您必须手动添加子分区。

示例 - 创建您的 table 后,您将得到一个包含两个子分区的分区

select PARTITION_NAME, SUBPARTITION_NAME,HIGH_VALUE  
from user_tab_subpartitions where table_name = 'TEST';

PARTITION_NAME SUBPARTITION_NAME HIGH_VALUE  
-------------- ----------------- ----------
TEST_Y2018     TEST_Y2018M7D1_   'ABC'     
TEST_Y2018     TEST_Y2018M7D1_   'DEF'

插入一行会添加另一个具有相同两个子分区的分区:

insert into test (UNIQUE_ID,LOGIN_INTFID,LOGIN_SEQNO,LOGIN_DATE) 
values(1,'ABC',1,DATE'2018-08-02');

PARTITION_NAME SUBPARTITION_NAME    HIGH_VALUE 
-------------- -------------------- ----------
TEST_Y2018     TEST_Y2018M7D1_SP1   'ABC'    
TEST_Y2018     TEST_Y2018M7D1_SP2   'DEF'    
SYS_P14654     SYS_SUBP14652        'ABC'    
SYS_P14654     SYS_SUBP14653        'DEF'  

现在您更改子分区模板 - 通过定义所有新的子分区

ALTER TABLE TEST SET SUBPARTITION TEMPLATE (
SUBPARTITION SP1 VALUES ('ABC'),
SUBPARTITION SP2 VALUES ('DEF'),
SUBPARTITION SP3 VALUES('XYZ'));

并添加另一行

insert into test (UNIQUE_ID,LOGIN_INTFID,LOGIN_SEQNO,LOGIN_DATE) 
values(1,'ABC',1,DATE'2018-09-02');

新分区现在 如预期 三个子分区

PARTITION_NAME SUBPARTITION_NAME    HIGH_VALUE  
-------------- -------------------- ----------
TEST_Y2018     TEST_Y2018M7D1_SP1   'ABC'    
TEST_Y2018     TEST_Y2018M7D1_SP2   'DEF'    
SYS_P14654     SYS_SUBP14652        'ABC'    
SYS_P14654     SYS_SUBP14653        'DEF'    
SYS_P14658     SYS_SUBP14655        'ABC'    
SYS_P14658     SYS_SUBP14656        'DEF'    
SYS_P14658     SYS_SUBP14657        'XYZ'