分区表作为数据库运维中经常碰到的对象,在DCP考试中也是占比很重的一个模块。本篇从分区表的创建、合并、拆分、删除几个操作对分区表进行一个展示和讲解。
达梦数据库中分区表可以分为三类:范围分区、哈希分区、列表分区,本节将展示三种分区表的创建操作。
范围分区是按照某个列或几个列的值的范围来创建分区,当用户向表中写入数据时,数据库服务器将按照这些列上的值进行判断,将数据写入相应的分区中。
下面开始进行实例展示:
登录管理工具,创建表,选择分区
点击左边【分区】,勾选创建分区,选择添加分区,进行分区类型选择
分区选择,类型选择【范围分区】,同时以PROC表的TIME时间列作为分区列
添加分区列,对分区列进行范围限制
这里选择的是TIME作为时间列,那么就以时间段作为范围划分
注意:分区项的范围值必须要从小到大,否则创建会出现报错
点击【确认】即可完成范围分区表的创建,具体的创建DDL如下:
CREATE TABLE "DMHS"."PROC"
(
"ID" INT,
"NAME" VARCHAR(100),
"TIME" DATETIME(6))
PARTITION BY RANGE("TIME")
(
PARTITION "P1" VALUES LESS THAN(DATETIME'2022-01-01 00:00:00') STORAGE(ON "DMHS", CLUSTERBTR) ,
PARTITION "P2" VALUES LESS THAN(DATETIME'2023-01-01 00:00:00') STORAGE(ON "DMHS", CLUSTERBTR) ,
PARTITION "P3" VALUES LESS THAN(DATETIME'2024-01-01 00:00:00') STORAGE(ON "DMHS", CLUSTERBTR) ,
PARTITION "P4" VALUES LESS THAN(DATETIME'2025-01-01 00:00:00') STORAGE(ON "DMHS", CLUSTERBTR) ,
PARTITION "P5" VALUES LESS THAN(DATETIME'2026-01-01 00:00:00') STORAGE(ON "DMHS", CLUSTERBTR)
) ;
查询分区表的分区情况:
可通过以下SQL查询信息
--查询分区表的分区情况
SELECT TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME,HIGH_VALUE FROM SYS.DBA_TAB_PARTITIONS WHERE TABLE_NAME='PROC';
--查询分区表定义
SELECT DBMS_METADATA .GET_DDL('TABLE','PROC','DMHS'); --也可以在管理工具上右键表看属性来获取DDL
插入数据,查看数据分布情况
插入数据
INSERT INTO DMHS.PROC VALUES (1,'ABC','2021-01-26');
INSERT INTO DMHS.PROC VALUES (2,'BCD','2022-05-21');
INSERT INTO DMHS.PROC VALUES (3,'DEF','2023-06-15');
INSERT INTO DMHS.PROC VALUES (4,'EFG','2024-1-15');
INSERT INTO DMHS.PROC VALUES (5,'FGH','2025-11-1');
INSERT INTO DMHS.PROC VALUES (6,'DGA','2025-3-28');
查询分区表数据
--查看分区表整体数据情况
select * from DMHS.PROC;
--查看指定分区项内的数据情况
SELECT * FROM DMHS.PROC PARTITION(P1);
哈希分区提供了一种在指定数量的分区中均等地划分数据的方法,基于分区键的散列值将行映射到分区中。
实例展示:
创建实例表,选择分区
点击左边【分区】,勾选创建分区,选择添加分区,进行分区类型选择
分区选择,类型选择【哈希分区】,以SALES表ID列作为分区列
添加分区列
哈希分区可以自行根据分区项对数据进行平均分布,不需要指定范围
确认后即可完成哈希分区表的创建,具体DDL如下:
CREATE TABLE "DMHS"."SALES"
(
"ID" INT,
"NAME" VARCHAR2(100))
PARTITION BY HASH("ID")
(
PARTITION "P1",
PARTITION "P2",
PARTITION "P3",
PARTITION "P4",
PARTITION "P5"
);
当然哈希分区表还可以通过指定分区个数和分区名自动创建
CREATE TABLE sales_hash(ID INT, NAME VARCHAR2(100)) PARTITION BY HASH(ID) PARTITIONS 4;
插入数据,查看数据分布情况
通过for循环批量插入数据
BEGIN
FOR i in 1..500 LOOP
INSERT INTO DMHS.SALES VALUES(i,TO_CHAR(SYSDATE)||'i');
end LOOP;
commit;
END;
查询分区表数据分布
--查看指定分区项内的数据情况
SELECT * FROM DMHS.PROC PARTITION(P2);
通过指定表中的某一个列的离散值集,来确定应当存储在一起的数据。如果某个列上的数据无法通过划分范围的方法进行分区,并且该列上的数据是相对固定的一些值,就可以考虑使用L IST 分区。、
实例展示:
创建实例表,选择添加分区,进行分区类型选择
分区选择,类型选择【列表分区】,以SALES02表CITY列作为分区列
添加分区列,以具体的数值进行分区,比如这里使用城市名作为分区条件
确认后即可完成哈希分区表的创建,具体DDL如下:
CREATE TABLE "DMHS"."SALES02"
(
"SALE_ID" INT,
"SALE_NAME" VARCHAR(100),
"SALEDATE" DATETIME(6),
"CITY" VARCHAR2(100))
PARTITION BY LIST("CITY")
(
PARTITION "P1" VALUES('BJ','TJ'),
PARTITION "P2" VALUES('NJ','SH'),
PARTITION "P3" VALUES('CS','WH'),
PARTITION "P4" VALUES('GZ','SZ')
);
插入数据,查看数据分布情况
简单插入一些测试数据
INSERT INTO DMHS.SALES02 VALUES (101,'ABC','2003-12-26','BJ');
INSERT INTO DMHS.SALES02 VALUES (102,'AAA','2008-06-11','NJ');
INSERT INTO DMHS.SALES02 VALUES (103,'DSD','2013-5-21','WH');
INSERT INTO DMHS.SALES02 VALUES (103,'FGDA','2019-6-1','CS');
INSERT INTO DMHS.SALES02 VALUES (104,'FFF','2016-10-21','SZ');
查询分区表数据分布
SELECT * FROM DMHS.SALES02;
针对范围分区,当插入数据超出已有分区范围时,会因为无法匹配分区范围报错导致数据无法插入,这个时候就需要通过在选择分区类型时添加间隔分区。
所谓间隔分区,是一种自动化范围分区策略,就是以一个区间分区表为“起点”,并在定义中增加了一个规则(即间隔),使数据库知道将来如何增加分区。
间隔分区添加的关键字:
例如,创建分区表PROC时添加时间为分区项的间隔分区,当有新的数据产生,表会自动创建分区
如果分区的数据很少,或相对其他分区某些分区的数据量较少,导致I/O不均衡,就可以考虑使用合并分区。仅范围分区表支持合并分区。
合并操作:
管理工具中找到对应表,下拉找到【子表】,右键选择【分区管理】
点击【合并分区】,选择需要合并的两个分区,并使用新的分区名
这里使用PROC测试表,将P3和P4两个分区项合并为一个分区项,重命名为P3_4
合并分区的具体SQL语句:
alter table DMHS.PROC MERGE PARTITIONS P3,P4 into partition P3_4;
注意:
当一个分区变得太大以至于要用很长时间才能完成备份、恢复或维护操作时,就应考虑做分割分区的工作。
拆分操作:
管理工具中找到对应表,下拉找到【子表】,右键选择【分区管理】
点击【拆分分区】,选择需要拆分的分区名,给出拆分的表达式,以该表达式分出两个范围区,同时给出两个拆分的分区名
这里同样以PROC测试表为例,将P3_4拆分为P3和P4,分为‘2024-01-01’和‘2025-01-01’两个分区范围
拆分分区的具体SQL语句:
alter table DMHS.PROC
split partition P3_4 at('2024-12-31') INTO(PARTITION P3,
partition P4);
删除分区本身较快,但有一条通用底线:分区数只剩一个时不允许删除,不能把表删到零个分区。
删除操作:
管理工具中找到对应表,下拉找到【子表】,右键选择【分区管理】
点击【删除分区】,选择需要删除的分区名,放到待删除分区处,点击确认即可删除
删除分区的具体SQL语句:
alter table "DMHS"."PROC"
drop partition "P5";
注意:删除表中的一个分区,分区中的数据也会被自动删除
PARTITION pn VALUES LESS THAN (MAXVALUE)作为兜底分区;或者直接使用间隔分区,由系统在插入数据时按INTERVAL表达式自动创建分区。文章
阅读量
获赞
