注册
达梦数据库分区表浅识
专栏/培训园地/ 文章详情 /

达梦数据库分区表浅识

白柏子 2026/11/05 81 0 0
摘要

达梦数据库分区表

​ 分区表作为数据库运维中经常碰到的对象,在DCP考试中也是占比很重的一个模块。本篇从分区表的创建、合并、拆分、删除几个操作对分区表进行一个展示和讲解。

分区表创建

​ 达梦数据库中分区表可以分为三类:范围分区、哈希分区、列表分区,本节将展示三种分区表的创建操作。

范围分区

​ 范围分区是按照某个列或几个列的值的范围来创建分区,当用户向表中写入数据时,数据库服务器将按照这些列上的值进行判断,将数据写入相应的分区中。

  • 下面开始进行实例展示:

    1. 登录管理工具,创建表,选择分区

      1.png

    2. 点击左边【分区】,勾选创建分区,选择添加分区,进行分区类型选择

      2.png

    3. 分区选择,类型选择【范围分区】,同时以PROC表的TIME时间列作为分区列

      3.png

    4. 添加分区列,对分区列进行范围限制

      • 这里选择的是TIME作为时间列,那么就以时间段作为范围划分

        注意:分区项的范围值必须要从小到大,否则创建会出现报错

        4.png

​ 点击【确认】即可完成范围分区表的创建,具体的创建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);

哈希分区

​ 哈希分区提供了一种在指定数量的分区中均等地划分数据的方法,基于分区键的散列值将行映射到分区中。

  • 实例展示:

    1. 创建实例表,选择分区

      6.png

    2. 点击左边【分区】,勾选创建分区,选择添加分区,进行分区类型选择

      2.png

    3. 分区选择,类型选择【哈希分区】,以SALES表ID列作为分区列

      7.png

    4. 添加分区列

      8.png

      ​ 哈希分区可以自行根据分区项对数据进行平均分布,不需要指定范围

      • 确认后即可完成哈希分区表的创建,具体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 分区。、

  • 实例展示:

    1. 创建实例表,选择添加分区,进行分区类型选择

      2.png

    2. 分区选择,类型选择【列表分区】,以SALES02表CITY列作为分区列

      10.png

    3. 添加分区列,以具体的数值进行分区,比如这里使用城市名作为分区条件

      11.png

      • 确认后即可完成哈希分区表的创建,具体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;

注意事项

  • 针对范围分区,当插入数据超出已有分区范围时,会因为无法匹配分区范围报错导致数据无法插入,这个时候就需要通过在选择分区类型时添加间隔分区。

    • 所谓间隔分区,是一种自动化范围分区策略,就是以一个区间分区表为“起点”,并在定义中增加了一个规则(即间隔),使数据库知道将来如何增加分区。

    • 间隔分区添加的关键字:

      • numtoyminterval(年,月)
      • numtodsinterval(天,秒)
    • 例如,创建分区表PROC时添加时间为分区项的间隔分区,当有新的数据产生,表会自动创建分区

      12.png

分区表合并

​ 如果分区的数据很少,或相对其他分区某些分区的数据量较少,导致I/O不均衡,就可以考虑使用合并分区。仅范围分区表支持合并分区。

  • 合并操作:

    • 管理工具中找到对应表,下拉找到【子表】,右键选择【分区管理】

    • 点击【合并分区】,选择需要合并的两个分区,并使用新的分区名

      • 这里使用PROC测试表,将P3和P4两个分区项合并为一个分区项,重命名为P3_4

        13.png

    • 合并分区的具体SQL语句:

      alter table DMHS.PROC MERGE PARTITIONS P3,P4 into partition P3_4;
  • 注意:

    • 合并分区要求两个分区在范围上严格相邻,仅支持范围分区和 LIST 分区执行此操作。合并后,低分区号的数据并入高分区,新分区上限继承原高分区

分区表拆分

​ 当一个分区变得太大以至于要用很长时间才能完成备份、恢复或维护操作时,就应考虑做分割分区的工作。

  • 拆分操作:

    • 管理工具中找到对应表,下拉找到【子表】,右键选择【分区管理】

    • 点击【拆分分区】,选择需要拆分的分区名,给出拆分的表达式,以该表达式分出两个范围区,同时给出两个拆分的分区名

      • 这里同样以PROC测试表为例,将P3_4拆分为P3和P4,分为‘2024-01-01’和‘2025-01-01’两个分区范围

        14.png

    • 拆分分区的具体SQL语句:

      alter table DMHS.PROC split partition P3_4 at('2024-12-31') INTO(PARTITION P3, partition P4);

分区删除

​ 删除分区本身较快,但有一条通用底线:分区数只剩一个时不允许删除,不能把表删到零个分区。

  • 删除操作:

    • 管理工具中找到对应表,下拉找到【子表】,右键选择【分区管理】

    • 点击【删除分区】,选择需要删除的分区名,放到待删除分区处,点击确认即可删除

      • 以删除PROC测试表中P5分区项为例

      15.png

    • 删除分区的具体SQL语句:

      alter table "DMHS"."PROC" drop partition "P5";

    注意:删除表中的一个分区,分区中的数据也会被自动删除

总结

  • 如果业务数据会持续超出已知范围,可以在建表末尾追加PARTITION pn VALUES LESS THAN (MAXVALUE)作为兜底分区;或者直接使用间隔分区,由系统在插入数据时按INTERVAL表达式自动创建分区。
  • 达梦仅支持范围分区和LIST分区执行合并,范围分区的两个被合并分区必须在范围上相邻,列表分区合并时不要求相邻,可以任意组合。
  • 达梦仅允许对范围分区和LIST分区执行删除,哈希分区不支持删除分区。删除分区后,该分区内的数据随子表一并清除,不可回退;分区索引会同步清理对应部分,不需要额外手工重建。
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服