2025年DM 分区表

DM 分区表DM 分区表 分区表概念 分区是指将表 索引等数据库对象划分为较小的可管理片段的技术 每一个片段称为分区子表或分区索引 一个表被分区后 对表的查询操作可以局限于某个分区进行 而不是整个表 这样可以大大提高查询速度 DM 采用子表方式创建分区表 分区表作为分区主表

大家好,我是讯享网,很高兴认识大家。

DM 分区表

分区表概念

分区是指将表、索引等数据库对象划分为较小的可管理片段的技术,每一个片段称为分区子表或分区索引。一个表被分区后,对表的查询操作可以局限于某个分区进行,而不是整个表,这样可以大大提高查询速度

DM 采用子表方式创建分区表,分区表作为分区主表,而每一个分区以一个子表实体存在,即每一个分区都是一个完整的表,一般命名为主表名_分区名。对于水平分区,子表跟主表具有相同的逻辑结构,即分区子表与分区主表有相同的列定义和约束定义。在 DM 分区表中,主表本身不存储数据,所有数据只存储在子表中,从而实现不同分区的完全独立性。 水平分区子表删除后,会将子表上的数据一起删除

分区表优点

由于每一个分区都以一个子表作为实体,那么不同分区可以存储于相同表空间,也可以位于不同的表空间中,将这些分区放在不同的表空间中具有以下的好处:

  • 减少所有数据都损坏的可能性,一个表空间损坏不影响其他表空间,提高可用性;
  • 恢复时间大大减少;
  • 可以将同一个表中的数据分布在不同的磁盘上,从而均衡磁盘上的 I/O 操作;
  • 提高了表的可管理性、可利用性和访问效率

分区表方法

DM 支持对表进行水平分区,对于水平分区,提供以下方式:

  • 范围(range)水平分区:对表中的某些列上值的范围进行分区,根据某个值的范围决定将该数据存储在哪个分区
  • 哈希(hash)水平分区:通过指定分区编号来均匀分布数据的一种分区类型,通过在 I/O 设备上进行散列分区,使得这些分区大小基本一致
  • 列表(list)水平分区:通过指定表中的某个列的离散值集,来确定应当存储在一起的数据。例如,可以对表上的 status 列的值在(‘A’,‘H’,‘O’)放在一个分区,值在(‘B’,‘I’,‘P’)放在另一个分区,以此类推
  • 多级分区表:按上述三种分区方法进行任意组合,将表进行多次分区,称为多级分区表

水平分区表的创建

范围分区表

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

在创建范围分区时,首先要指定分区列,即按照哪些列进行分区,然后为每个分区指定数据范围。范围分区支持 MAXVALUE 范围值的使用,MAXVALUE 相当于一个比任何值都大的值。范围分区非常适用于数据按时间范围组织的表,不同的时间段的数据属于不同的分区。

例如,以下语句创建一个范围分区表 callinfo,用来记录用户的 2010 年的电话通讯信息,包括主叫号码、被叫号码、通话时间和时长,并且根据季度进行分区

CREATE TABLE callinfo( caller CHAR(15), callee CHAR(15), time DATETIME, duration INT ) PARTITION BY RANGE(time)( PARTITION p1 VALUES LESS THAN ('2010-04-01'), PARTITION p2 VALUES LESS THAN ('2010-07-01'), PARTITION p3 VALUES LESS THAN ('2010-10-01'), PARTITION p4 VALUES EQU OR LESS THAN ('2010-12-31') //'2010-12-31'也可替换为MAXVALUE ); 
讯享网

创建情况如下

在这里插入图片描述

LIST 分区表

范围分区是按照某个列上的数据范围进行分区的,如果某个列上的数据无法通过划分范围的方法进行分区,并且该列上的数据是相对固定的一些值,可以考虑使用 LIST 分区。一般来说,对于数字型或者日期型的数据,适合采用范围分区的方法;而对于字符型数据,取值比较固定的,则适合于采用 LIST 分区的方法

例如创建一个产品销售记录表 sales,记录产品的销量情况。由于产品只在几个固定的城市销售,所以可以按照销售城市对该表进行分区

讯享网CREATE TABLE sales( sales_id INT, saleman CHAR(20), saledate DATETIME, city CHAR(10) ) PARTITION BY LIST(city)( PARTITION p1 VALUES ('北京', '天津'), PARTITION p2 VALUES ('上海', '南京', '杭州'), PARTITION p3 VALUES ('武汉', '长沙'), PARTITION p4 VALUES ('广州', '深圳') ); 

创建情况如下

在这里插入图片描述

哈希分区表

在很多情况下,用户无法预测某个列上的数据变化范围,因而无法实现创建固定数量的范围分区或 LIST 分区

在这种情况下,DM 哈希分区提供了一种在指定数量的分区中均等地划分数据的方法,基于分区键的散列值将行映射到分区中。当用户向表中写入数据时,数据库服务器将根据一个哈希函数对数据进行计算,把数据均匀地分布在各个分区中。在哈希分区中,用户无法预测数据将被写入哪个分区中

现在重新考虑产品销售表的例子。如果销售城市不是相对固定的,而是遍布全国各地,这时很难对表进行 LIST 分区。如果为该表进行哈希分区,可以很好地解决这个问题

CREATE TABLE sales01( sales_id INT, saleman CHAR(20), saledate DATETIME, city CHAR(10) ) PARTITION BY HASH(city)( PARTITION p1, PARTITION p2, PARTITION p3, PARTITION p4 ); 

创建情况如下

在这里插入图片描述

多级分区表

在很多情况下,经过一次分区并不能精确地对数据进分类,这时需要多级分区表

例如创建一个产品销售记录表 sales,记录产品的销量情况。由于产品需要按地点和销售时间进行统计,则可以对该表进行 LIST-RANGE 分区

讯享网DROP TABLE SALES; CREATE TABLE SALES( SALES_ID INT, SALEMAN CHAR(20), SALEDATE DATETIME, CITY CHAR(10) ) PARTITION BY LIST(CITY) SUBPARTITION BY RANGE(SALEDATE) SUBPARTITION TEMPLATE( SUBPARTITION P11 VALUES LESS THAN ('2012-04-01'), SUBPARTITION P12 VALUES LESS THAN ('2012-07-01'), SUBPARTITION P13 VALUES LESS THAN ('2012-10-01'), SUBPARTITION P14 VALUES EQU OR LESS THAN (MAXVALUE)) ( PARTITION P1 VALUES ('北京', '天津') ( SUBPARTITION P11_1 VALUES LESS THAN ('2012-10-01'), SUBPARTITION P11_2 VALUES EQU OR LESS THAN (MAXVALUE) ), PARTITION P2 VALUES ('上海', '南京', '杭州'), PARTITION P3 VALUES (DEFAULT) ); 

创建情况如下

在这里插入图片描述

水平分区表操作

增加分区

DM支持用 ALTER TABLE ADD PARTITION 语句将新分区增加到最后一个现存分区的后面

举例,范围分区表callinfo现需要记录用户的2023年的第一季度的通讯信息,那么,需要为2023年第一季度增加一个分区

ALTER TABLE callinfo ADD PARTITION p5 VALUES LESS THAN ('2023-4-1'); 

操作结果如下

在这里插入图片描述

注意:对于范围分区,增加分区必须在最后一个分区范围值的后面添加,要想在表的开始范围或中间增加分区,应使用 SPLIT PARTITION 语句,而当范围分区表最后一项为 MAXVALUE 时直接添加会报错,需要将 MAXVLAUE 项删除后添加所需项,再补充上 MAXVALUE 项

注意:对于LIST分区,增加分区包含的离散值不能已存在于某个分区中

注意:只能对范围分区和 LIST 分区增加分区,不能对哈希分区增加分区

删除分区

DM支持用 ALTER TABLE DROP PARTITION 语句将分区删除

范围分区表 callinfo 现需要删除记录用户的2022年的第一季度的通讯信息,那么,只需删除 callinfo 的分区p1即可

ALTER TABLE callinfo DROP PARTITION p1; 

操作结果如下

在这里插入图片描述

交换分区

假设上文提到的 callinfo 表是用于维护最近12个月的用户通话信息,超过12个月的订单需要迁移到该季度的通话信息历史表中,并且每一个季度都有一个相应的历史表。如果没有使用水平分区,需要较多的删除和插入操作,并产生大量的redo和undo日志。

如果使用分区表,如上文提到的 callinfo,只需使用交换分区即可完成以上功能。

创建表 callinfo_2022Q2

CREATE TABLE callinfo_2022Q2( caller CHAR(15), callee CHAR(15), time DATETIME, duration INT ); 

交换分区

ALTER TABLE callinfo EXCHANGE PARTITION p2 WITH TABLE callinfo_2022Q2; 

删除原分区

ALTER TABLE callinfo DROP PARTITION p2; 

新增分区,记录 2023 年第二季度通话记录

ALTER TABLE callinfo ADD PARTITION p6 VALUES LESS THAN ('2023-7-1'); 

操作结果如下

在这里插入图片描述

通过交换分区实现分区 p2 和新建表 callinfo_2022Q2 的数据交换,表 callinfo_2022Q2 将得到2022年第二季度的通话记录,而分区 p2 数据将被清空。交换分区采用数据字典信息交换的技术,几乎不涉及 IO 操作,因此效率非常高

注意:仅范围分区和 LIST 分区支持交换分区,哈希分区表不支持

合并分区

举例,可将 callinfo 的 2022第3季度和第4季度合并成一个分区

ALTER TABLE callinfo MERGE PARTITIONS p3, p4 into partition p3_4; 

操作结果如下

在这里插入图片描述

拆分分区

ALTER TABLE 语句的 SPLIT PARTITION 子句被用于将一分区中的内容重新划分成两个新的分区。当一个分区变得太大以至于要用很长时间才能完成备份、恢复或维护操作时,就应考虑做分割分区的工作,还可以用 SPLIT PARTITION 子句来重新划分 I/O 负载

举例,将合并后的 p3_4 拆分为原两分区 p3 和 p4,分别记录2010年第三和第四季度的通话记录

ALTER TABLE callinfo SPLIT PARTITION p3_4 AT ('2010-9-30') INTO (PARTITION p3, PARTITION p4); 

操作结果如下

在这里插入图片描述

达梦在线服务平台:https://eco.dameng.com

小讯
上一篇 2025-03-25 10:45
下一篇 2025-01-27 22:32

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/72730.html