代码之家  ›  专栏  ›  技术社区  ›  Somnath Musib Ray

Oracle间隔分区不是用alter子分区模板自动创建的。

  •  1
  • Somnath Musib Ray  · 技术社区  · 6 年前

    我用的是甲骨文 12c 间隔划分。我创造了 range partition 具有 1 month interval list sub-partition 使用唯一标识符(比如 LOGIN_INTFID )

    在表格中 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 回复  |  直到 6 年前
        1
  •  2
  •   Marmite Bomber    6 年前

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

    作为 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'