使用 alter sub-partition template 不会自动创建 Oracle 间隔分区
Oracle interval partitions are not created automatically with alter sub-partition template
我正在使用 oracle 12c
间隔分区。我创建了 range partition
与 1 month interval
和 list 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'
我正在使用 oracle 12c
间隔分区。我创建了 range partition
与 1 month interval
和 list 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'