注册
关于达梦范围分区表的常规操作
培训园地/ 文章详情 /

关于达梦范围分区表的常规操作

杨锋 2023/08/25 1973 0 0

范围分区表管理

• 分区是指将表、索引等数据库对象划分为较小的可管理片段的技术,每一个片段称为分区子表或分区索引。

以下将结合达梦官方文档和我个人的学习测试经过,跟大家分享下达梦数据库的范围分区表管理内容。

水平分区表

达梦数据库 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';

11.png

分区交换

• 创建一张空表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';

11.png

分区合并

• 将相邻的两个分区合并为一个新分区:

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';

11.png

分区删除

• 注意:该分区内的数据会一起删除

 alter table u2.tp1 drop partition part_4;

11.png

• 此时原来的part_4分区被删除,tp1表没有一个存放小于maxvalue的分区,尝试插入大于part_3的数据:

insert into u2.tp1 values ('2024-08-08',null);

11.png

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服