暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

Oracle rang 分区表含有maxvalue分区添加新分区操作步骤及注意事项

原创 尚雷 2023-01-09
1928

注:有些表被初期或者后期改造成分区表,为了保证分区数据能正常插入,有些习惯再最后设置一个maxvalue分区,但一旦过多数据超过maxvalue的上一个分区,就会造成maxvalue分区有大量数据,严重影响性能。

带有maxvalue的分区无法像普通分区直接在最大分区后执行add添加新分区,要使用split来对maxvalue分区进行拆分,但在拆分时一定要先充分测试,尽量减少对生产环境的影响。

测试过程

一、创建分区表

– 创建分区表

create table p_range_test (id number,name varchar2(100))
   partition by range(id)(
   partition t_p1   values less than (10),
   partition t_p2   values less than (20),
   partition t_p3   values less than (30),
   partition t_pmax values less than (maxvalue));

-- 查询当前分区表信息
SQL> select table_name,partition_name,high_value,tablespace_name from user_tab_partitions where table_name='P_RANGE_TEST' order by partition_position;

TABLE_NAME           PARTITION_NAME       HIGH_VALUE TABLESPACE_NAME
-------------------- -------------------- ---------- ---------------
P_RANGE_TEST         T_P1                 10         T_HS_MESSAGE
P_RANGE_TEST         T_P2                 20         T_HS_MESSAGE
P_RANGE_TEST         T_P3                 30         T_HS_MESSAGE
P_RANGE_TEST         T_PMAX               MAXVALUE   T_HS_MESSAGE

二、插入数据

-- 插入数据
insert into p_range_test values (1,'A');
insert into p_range_test values (2,'B');
insert into p_range_test values (3,'C');
insert into p_range_test values (4,'D');
insert into p_range_test values (5,'E');
insert into p_range_test values (6,'F');
insert into p_range_test values (7,'G');
insert into p_range_test values (8,'H');
insert into p_range_test values (9,'I');

insert into p_range_test values (10,'AA');
insert into p_range_test values (11,'BB');
insert into p_range_test values (12,'CC');
insert into p_range_test values (13,'DD');
insert into p_range_test values (14,'EE');
insert into p_range_test values (15,'FF');
insert into p_range_test values (16,'GG');
insert into p_range_test values (17,'HH');
insert into p_range_test values (18,'II');
insert into p_range_test values (19,'II');

insert into p_range_test values (20,'AAA');
insert into p_range_test values (21,'BBB');
insert into p_range_test values (22,'CCC');
insert into p_range_test values (23,'DDD');
insert into p_range_test values (24,'EEE');
insert into p_range_test values (25,'FFF');
insert into p_range_test values (26,'GGG');
insert into p_range_test values (27,'HHH');
insert into p_range_test values (28,'III');
insert into p_range_test values (29,'III');

insert into p_range_test values (30,'AAAA');
insert into p_range_test values (31,'BBBB');
insert into p_range_test values (32,'CCCC');
insert into p_range_test values (33,'DDDD');
insert into p_range_test values (34,'EEEE');
insert into p_range_test values (35,'FFFF');
insert into p_range_test values (36,'GGGG');
insert into p_range_test values (37,'HHHH');
insert into p_range_test values (38,'IIII');
insert into p_range_test values (39,'IIII');

insert into p_range_test values (40,'AAAAA');
insert into p_range_test values (41,'BBBBB');
insert into p_range_test values (42,'CCCCC');
insert into p_range_test values (43,'DDDDD');
insert into p_range_test values (44,'EEEEE');
insert into p_range_test values (45,'FFFFF');
insert into p_range_test values (46,'GGGGG');
insert into p_range_test values (47,'HHHHH');
insert into p_range_test values (48,'IIIII');
insert into p_range_test values (49,'IIIII');

insert into p_range_test values (50,'AAAAAA');
insert into p_range_test values (51,'BBBBBB');
insert into p_range_test values (52,'CCCCCC');
insert into p_range_test values (53,'DDDDDD');
insert into p_range_test values (54,'EEEEEE');
insert into p_range_test values (55,'FFFFFF');
insert into p_range_test values (56,'GGGGGG');
insert into p_range_test values (57,'HHHHHH');
insert into p_range_test values (58,'IIIIII');
insert into p_range_test values (59,'IIIIII');
commit;

-- 查询各分区对应数据信息
SQL> select * from p_range_test partition(t_p1);

        ID NAME
---------- ----------------------------------------------------------------------------------------------------
         1 A
         2 B
         3 C
         4 D
         5 E
         6 F
         7 G
         8 H
         9 I

9 rows selected.

SQL> select * from p_range_test partition(t_p2);

        ID NAME
---------- ----------------------------------------------------------------------------------------------------
        10 AA
        11 BB
        12 CC
        13 DD
        14 EE
        15 FF
        16 GG
        17 HH
        18 II
        19 II

10 rows selected.

SQL> select * from p_range_test partition(t_p3);

        ID NAME
---------- ----------------------------------------------------------------------------------------------------
        20 AAA
        21 BBB
        22 CCC
        23 DDD
        24 EEE
        25 FFF
        26 GGG
        27 HHH
        28 III
        29 III

10 rows selected.

select * from p_range_test partition(t_pmax);
SQL> select * from p_range_test partition(t_pmax);

        ID NAME
---------- ----------------------------------------------------------------------------------------------------
        30 AAAA
        31 BBBB
        32 CCCC
        33 DDDD
        34 EEEE
        35 FFFF
        36 GGGG
        37 HHHH
        38 IIII
        39 IIII
        40 AAAAA
        41 BBBBB
        42 CCCCC
        43 DDDDD
        44 EEEEE
        45 FFFFF
        46 GGGGG
        47 HHHHH
        48 IIIII
        49 IIIII
        50 AAAAAA
        51 BBBBBB
        52 CCCCCC
        53 DDDDDD
        54 EEEEEE
        55 FFFFFF
        56 GGGGGG
        57 HHHHHH
        58 IIIIII
        59 IIIIII

30 rows selected.

三、拆分分区

-- 无法对含有maxvalue分区表使用add partition 方式添加分区
SQL> alter table p_range_test add partition t_p4 values less than(40);
alter table p_range_test add partition t_p4 values less than(40)
                                       *
ERROR at line 1:
ORA-14074: 分区界限必须调整为高于最后一个分区界限

-- 使用split拆分分区
-- 使用此方式会默认创建以SYS开头的新分区
SQL> alter table p_range_test split partition t_pmax at (40) into (partition, partition t_pmax);

Table altered.

-- 查询分区表信息
SQL> select table_name,partition_name,high_value,tablespace_name from user_tab_partitions where table_name='P_RANGE_TEST' order by partition_position;

TABLE_NAME           PARTITION_NAME       HIGH_VALUE TABLESPACE_NAME
-------------------- -------------------- ---------- ---------------
P_RANGE_TEST         T_P1                 10         T_HS_MESSAGE
P_RANGE_TEST         T_P2                 20         T_HS_MESSAGE
P_RANGE_TEST         T_P3                 30         T_HS_MESSAGE
P_RANGE_TEST         SYS_P822             40         T_HS_MESSAGE
P_RANGE_TEST         T_PMAX               MAXVALUE   T_HS_MESSAGE

SQL> select * from p_range_test partition(sys_p822);

        ID NAME
---------- ----------------------------------------------------------------------------------------------------
        30 AAAA
        31 BBBB
        32 CCCC
        33 DDDD
        34 EEEE
        35 FFFF
        36 GGGG
        37 HHHH
        38 IIII
        39 IIII

10 rows selected.

SQL> select * from p_range_test partition(t_pmax);

        ID NAME
---------- ----------------------------------------------------------------------------------------------------
        40 AAAAA
        41 BBBBB
        42 CCCCC
        43 DDDDD
        44 EEEEE
        45 FFFFF
        46 GGGGG
        47 HHHHH
        48 IIIII
        49 IIIII
        50 AAAAAA
        51 BBBBBB
        52 CCCCCC
        53 DDDDDD
        54 EEEEEE
        55 FFFFFF
        56 GGGGGG
        57 HHHHHH
        58 IIIIII
        59 IIIIII

20 rows selected.

四、修改新分区名称

SQL> alter table p_range_test rename partition SYS_P822 to t_p4;

Table altered.

SQL> select * from p_range_test partition(t_p4);

        30 AAAA
        31 BBBB
        32 CCCC
        33 DDDD
        34 EEEE
        35 FFFF
        36 GGGG
        37 HHHH
        38 IIII
        39 IIII

10 rows selected.

SQL> select * from p_range_test partition(t_pmax);

        40 AAAAA
        41 BBBBB
        42 CCCCC
        43 DDDDD
        44 EEEEE
        45 FFFFF
        46 GGGGG
        47 HHHHH
        48 IIIII
        49 IIIII
        50 AAAAAA
        51 BBBBBB
        52 CCCCCC
        53 DDDDDD
        54 EEEEEE
        55 FFFFFF
        56 GGGGGG
        57 HHHHHH
        58 IIIIII
        59 IIIIII

20 rows selected.

备注

1)拆分并指定分区名

对于以上测试中第三和第四步骤,可以采用一步操作

alter table p_range_test split partition t_pmax at (40) into (partition t_p50, partition t_pmax);

以时间做分区进行split

alter table TEST.TB1 split partition P_MAX_VALUE at (TO_DATE('2023-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) into (partition PART2023_05, partition P_MAX_VALUE);

alter table TEST.TB2 split partition P_MAX_VALUE at (TO_DATE('2023-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) into (partition PART2023_06, partition P_MAX_VALUE);

2)split分区会导致局部分区索引失效

#3)split分区可能会导致ora-01652报错

最后修改时间:2023-01-31 14:06:03
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论