Oracle间隔分区不会使用alter子分区模板自动创建

时间:2018-08-02 02:13:07

标签: oracle partitioning

我正在使用oracle 12c间隔分区。我已经使用唯一标识符(分别说range partition)和1 month intervallist sub-partition创建了LOGIN_INTFID

在表DDL中,我添加了在创建表时已知的子分区列表。这是表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');

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

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

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

我在做什么错了?

1 个答案:

答案 0 :(得分:2)

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

documetation指出:

  

您可以通过将组合分区表替换为新的子分区模板来修改它的子分区模板。

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

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

示例-创建表后,您将获得一个分区和两个子分区

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'