• 分区是指将表、索引等数据库对象划分为较小的可管理片段的技术,每一个片段称为分区子表或分区索引。
以下将结合达梦官方文档和我个人的学习测试经过,跟大家分享下达梦数据库的范围分区表管理内容。
达梦数据库 DM 支持对表进行水平分区。
对于水平分区,提供以下分区方式:
• 范围(range)水平分区:对表中的某些列上值的范围进行分区,根据某个值的范围,决定将该数据存储在哪个分区上;
• 哈希(hash)水平分区:通过指定分区编号来均匀分布数据的一种分区类型,通过在 I/O 设备上进行散列分区,使得这些分区大小基本一致
• 列表(list)水平分区:通过指定表中的某个列的离散值集,来确定应当存储在一起的数据。例如,可以对表上的 status 列的值在('A','H','O')放在一个分区,值在('B','I','P')放在另一个分区,以此类推;
• 多级分区表:按上述三种分区方法进行任意组合,将表进行多次分区,称为多级分区表。
创建一个普通用户U2:
create user u2 identified by dameg123;
CREATE TABLE "U2"."TP1"
(
"COLUMN_1" DATETIME(6),
"COLUMN_2" CHAR(10))
PARTITION BY RANGE("COLUMN_1")
(
PARTITION "PART_1" VALUES LESS THAN(DATETIME'2022-01-01 00:00:00') STORAGE(ON "MAIN", CLUSTERBTR) ,
PARTITION "PART_2" VALUES LESS THAN(DATETIME'2023-07-01 00:00:00') STORAGE(ON "MAIN", CLUSTERBTR) ,
PARTITION "PART_3" VALUES LESS THAN(DATETIME'2023-08-01 00:00:00') STORAGE(ON "MAIN", CLUSTERBTR) ,
PARTITION "PART_4" VALUES LESS THAN(MAXVALUE) STORAGE(ON "MAIN", CLUSTERBTR)
) STORAGE(ON "MAIN", CLUSTERBTR) ;
• 查看分区定义
select * from dba_TAB_partitionS WHERE TABLE_OWNER='U2' AND TABLE_NAME='TP1';
结果:
行号 TABLE_OWNER TABLE_NAME PARTITION_NAME HIGH_VALUE
---------- ----------- ---------- -------------- -----------------------------
1 U2 TP1 PART_4 MAXVALUE
2 U2 TP1 PART_3 DATETIME'2023-08-01 00:00:00'
3 U2 TP1 PART_2 DATETIME'2023-07-01 00:00:00'
4 U2 TP1 PART_1 DATETIME'2022-01-01 00:00:00'
• 插入数据
insert into u2.tp1 values ('2023-08-08',null);
insert into u2.tp1 values ('2021-03-03','');
• 整表的查询
select * from u2.tp1;
• 根据分区来查询
select * from u2.tp1 partition(part_1);
• 检查分区定义
select * from dba_tab_partitions where table_owner='U2' and TABLE_NAME='TP1';
• 创建一张空表tp2
create table u2.tp2 as select * from u2.tp1 where 1=2;
• 将tp1的part_3与tp2交换(若要交换回来,可以再执行一次)
alter table u2.tp1 exchange partition part_1 with table u2.tp2;
• 检查part_1,发现part_1分区已经没有数据,因为数据被交换到tp2表中了
select * from u2.tp1 partition (part_1);
• 检查tp2表,发现原来tp1表part_1的数据已经交换过来
select * from u2.tp2;
• 将part_3从2023-07-15处拆分成两个分区:
alter table u2.tp1 SPLIT PARTITION part_3 AT ('2023-07-15') INTO (PARTITION p20230715,PARTITION part_3);
• 检查:
select * from dba_tab_partitions where table_owner='U2' and TABLE_NAME='TP1';
• 将相邻的两个分区合并为一个新分区:
alter table u2.tp1 merge partitions part_1, part_2 into partition p12;
• 检查:
select * from dba_tab_partitions where table_owner='U2' and TABLE_NAME='TP1';
• 注意:该分区内的数据会一起删除
alter table u2.tp1 drop partition part_4;
• 此时原来的part_4分区被删除,tp1表没有一个存放小于maxvalue的分区,尝试插入大于part_3的数据:
insert into u2.tp1 values ('2024-08-08',null);
文章
阅读量
获赞