使用新的子分区模板在 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 分区的主要内容,如果未能解决你的问题,请参考以下文章