1概述
本文主要测试分区表的“合并分区”和“拆分分区”的用法。
1.1分区类型
合并分区:如果分区的数据很少,或相对其他分区某些分区的数据量较少,导致 I/O不均衡,就可以考虑使用合并分区。
拆分分区:当一个分区变得太大以至于要用很长时间才能完成备份、恢复或维护操作时,就应考虑做分割分区的工作,还可以用 SPLIT PARTITION 子句来重新划分 I/O 负载。
2分区使用
2.1分区增删操作
分区表的增加和删除是运维中常见操作,这里简单测试下分区表的增加和删除操作。
2.1.1增加分区
2.1.1.1RANGE增加分区
创建分区表
SQL> CREATE TABLE test1(
C1 INT,
C2 CHAR(15),
C3 DATETIME
)
PARTITION BY RANGE(C3)(
PARTITION p1 VALUES LESS THAN ('2022-10-01'),
PARTITION p2 VALUES LESS THAN ('2022-11-01'),
PARTITION p3 VALUES LESS THAN ('2022-12-01'),
PARTITION p4 VALUES EQU OR LESS THAN (maxvalue)
);
增加分区
SQL> ALTER TABLE test1 ADD PARTITION p5 VALUES LESS THAN ('2022-09-01');
SQL> ALTER TABLE test1 ADD PARTITION p5 VALUES LESS THAN ('2023-01-01');
注意:当RANGE分区表设置了MAXVALUE最大值分区之后,后面的新增分区操作无法成功,因为新增分区值必须是递增的。若想再多划分几个分区,可以通过后面介绍的拆分分区来实现。
2.1.1.2LIST增加分区
创建分区表
SQL> CREATE TABLE test1(
id INT,
time DATETIME,
city CHAR(10)
)
PARTITION BY LIST(city)(
PARTITION p1 VALUES ('北京', '天津'),
PARTITION p2 VALUES ('上海', '南京'),
PARTITION p3 VALUES ('武汉', '长沙'),
PARTITION p10 VALUES (default)
);
增加分区
SQL> ALTER TABLE test1 ADD PARTITION p5 VALUES ('广州', '深圳');
注意:当LIST分区表设置了DEFAULT 默认分区值之后,后面的新增分区操作无法成功。只能先删除default分区,再增加新分区。删除default分区前可以用交换分区进行备份。
2.1.2删除分区
2.1.2.1RANGE删除分区
创建分区表
SQL> CREATE TABLE test1(
C1 INT,
C2 CHAR(15),
C3 DATETIME
)
PARTITION BY RANGE(C3)(
PARTITION p1 VALUES LESS THAN ('2022-10-01'),
PARTITION p2 VALUES LESS THAN ('2022-11-01'),
PARTITION p3 VALUES LESS THAN ('2022-12-01'),
PARTITION p4 VALUES EQU OR LESS THAN (maxvalue)
);
删除分区
SQL> ALTER TABLE test1 DROP PARTITION p3;
SQL> select TABLE_OWNER,TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME from dba_tab_partitions where TABLE_NAME='TEST1';
2.1.2.2LIST删除分区
创建分区表
SQL> CREATE TABLE test1(
id INT,
time DATETIME,
city CHAR(10)
)
PARTITION BY LIST(city)(
PARTITION p1 VALUES ('北京', '天津'),
PARTITION p2 VALUES ('上海', '南京'),
PARTITION p3 VALUES ('武汉', '长沙'),
PARTITION p10 VALUES (default)
);
删除分区
SQL> ALTER TABLE test1 DROP PARTITION p3;
SQL> select TABLE_OWNER,TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME from dba_tab_partitions where TABLE_NAME='TEST1';
2.2合并分区
要想将两个范围分区的内容融合到一个分区,就要使用 ALTER TABLE MERGE PARTITION 语句。
仅范围分区表和 LIST 分区表支持合并分区。其中,合并的 RANGE 分区必须是范围相邻的两分区。
多级分区表进行 MERGE 合并的注意事项:
仅支持一级子表类型为 RANGE、LIST;
合并多级分区表中的一级子表时,该一级子表下的二级及以上层次子表按照级别分别由系统自动合并为一个子表,子表名称为系统内部设置。RANGE类型范围值为MAXVALUE;LIST 类型范围值为 DEFAULT;
不允许自定义二级及以上层次子表;
不允许直接合并二级及以上层次子表。合并分区会导致数据的重组和分区索引的重建,因此,合并分区可能会比较耗时,所需时间取决于分区数据量的大小。
2.2.1RANGE合并分区
创建分区表
SQL> CREATE TABLE test1(
C1 INT,
C2 CHAR(15),
C3 DATETIME
)
PARTITION BY RANGE(C3)(
PARTITION p1 VALUES LESS THAN ('2022-09-01'),
PARTITION p2 VALUES LESS THAN ('2022-10-01'),
PARTITION p3 VALUES LESS THAN ('2022-11-01'),
PARTITION p4 VALUES LESS THAN ('2022-12-01'),
PARTITION p5 VALUES EQU OR LESS THAN (maxvalue)
);
合并分区
SQL> ALTER TABLE test1 MERGE PARTITIONS p2, p4 into partition p2_4;
SQL> ALTER TABLE test1 MERGE PARTITIONS p3, p4 into partition p3_4;
注意:当RANGE分区表合并时只能合并相邻的多个分区,不然会报错:[-2626]:要合并的分区不相邻.
2.2.2LIST合并分区
创建分区表
SQL> CREATE TABLE test1(
id INT,
time DATETIME,
city CHAR(10)
)
PARTITION BY LIST(city)(
PARTITION p1 VALUES ('北京', '天津'),
PARTITION p2 VALUES ('上海', '南京'),
PARTITION p3 VALUES ('武汉', '长沙'),
PARTITION p4 VALUES ('广州', '深圳'),
PARTITION p10 VALUES (default)
);
合并分区
SQL> ALTER TABLE test1 MERGE PARTITIONS p2, p4 into partition p2_4;
SQL> ALTER TABLE test1 MERGE PARTITIONS p1, p3 into partition p1_3;
注意:LIST分区表不会像RANGE分区表那样必须要相邻的分区才能合并,可随意组合合并分区。
2.3拆分分区
ALTER TABLE 语句的 SPLIT PARTITION 子句被用于将一分区中的内容重新划分成两个新的分区。
仅范围分区表和 LIST 分区表支持拆分分区。拆分分区另一个重要用途是作为新增分区的补充。通过拆分分区,可以对范围分区表的开始或中间范围添加分区。
多级分区表进行拆分 SPLIT 注意事项:
仅支持一级子表类型为 RANGE、LIST;
支持 SPLIT 为 2 个或多个子表;
不允许自定义二级及以上层次子表;
SPLIT 产生的新分区二级及以上层次子表结构与被分隔子表保持一致,名称由系统内部定义。
注意:拆分分区会导致数据的重组和分区索引的重建,因此,拆分分区可能会比较耗时,所需时间取决于分区数据量的大小。
2.3.1RANGE拆分分区
创建分区表
SQL> CREATE TABLE test1(
C1 INT,
C2 CHAR(15),
C3 DATETIME
)
PARTITION BY RANGE(C3)(
PARTITION p1 VALUES LESS THAN ('2022-09-01'),
PARTITION p2 VALUES LESS THAN ('2022-10-01'),
PARTITION p3 VALUES LESS THAN ('2022-11-01'),
PARTITION p4 VALUES LESS THAN ('2022-12-01'),
PARTITION p5 VALUES EQU OR LESS THAN (maxvalue)
);
拆分分区
SQL> ALTER TABLE test1 SPLIT PARTITION p3_4 AT ('2022-11-01') INTO (PARTITION p3, PARTITION p4);
或者
SQL> ALTER TABLE test1 SPLIT PARTITION p3_4 INTO(PARTITION p3 VALUES LESS THAN('2022-11-01'),PARTITION p4);
--检查分区信息
SQL> select TABLE_OWNER,TABLE_NAME,PARTITION_NAME,HIGH_VALUE,PARTITION_POSITION,TABLESPACE_NAME from dba_tab_partitions where TABLE_NAME='TEST1';
说明:RANGE分区表正常拆分完成。
DEFAULT默认分区拆分
SQL> ALTER TABLE test1 SPLIT PARTITION p5 INTO (PARTITION p5 VALUES LESS THAN('2023-01-01'), PARTITION p6 VALUES LESS THAN ('2023-02-01'), PARTITION p7 VALUES LESS THAN ('2023-03-01'), PARTITION p10);
--检查分区信息
SQL> select TABLE_OWNER,TABLE_NAME,PARTITION_NAME,HIGH_VALUE,PARTITION_POSITION,TABLESPACE_NAME from dba_tab_partitions where TABLE_NAME='TEST1';
2.3.2LIST拆分分区
创建分区表
SQL> CREATE TABLE test1(
id INT,
time DATETIME,
city CHAR(10)
)
PARTITION BY LIST(city)(
PARTITION p1 VALUES ('北京', '天津'),
PARTITION p2 VALUES ('上海', '南京'),
PARTITION p3 VALUES ('武汉', '长沙'),
PARTITION p4 VALUES ('广州', '深圳'),
PARTITION p10 VALUES (default)
);
拆分分区
SQL> ALTER TABLE test1 SPLIT PARTITION p2_4 values('上海', '南京') INTO(PARTITION P2,PARTITION P4);
或者
SQL> ALTER TABLE test1 SPLIT PARTITION p2_4 INTO(PARTITION p2 VALUES('上海', '南京'),PARTITION p4);
--检查分区信息
SQL> select TABLE_OWNER,TABLE_NAME,PARTITION_NAME,HIGH_VALUE,PARTITION_POSITION,TABLESPACE_NAME from dba_tab_partitions where TABLE_NAME='TEST1';
说明:LIST分区表正常拆分完成。
文章
阅读量
获赞