本文将对达梦数据库分区表概念、创建、维护进行介绍。
近几年,随着移动支付快速发展,银行交易系统中【移动小微支付场景】使用越来越多,系统中流水账单表数据量巨大,往往上TB。
为了提高流水账单表查询等操作响应,该表设计可以采用分区表。反应到实际生活场景中,日常我们使用手机移动银行APP查个人账单,查询菜单里有按年、按月、按季度查询,流水账单表可以使用分区表进行多级分区,例如,季度、月、周。
总结:采用分区表有两个显示的收益:
对表读写响应更快
方便历史数据快速归档
达梦数据库对分区表设计有深度的思考,可以更好的支持业务发展。下面DM分区表概念:
分区是指将表、索引等数据库对象划分为较小的可管理片段的技术,每一个片段称为分区子表或分区索引。一个表被分区后,对表的查询操作可以局限于某个分区进行,而不是整个表,这样可以大大提高查询速度。
达梦数据库 DM 支持对表进行水平分区。对于水平分区,提供以下分区方式:
范围分区非常适用于数据按时间范围组织的表,不同的时间段的数据属于不同的分区。
范围分区是按照某个列或几个列的值的范围来创建分区,当用户向表中写入数据时,数据库服务器将按照这些列上的值进行判断,将数据写入相应的分区中。
在创建范围分区时,首先要指定分区列,即按照哪些列进行分区,然后为每个分区指定数据范围。范围分区支持 MAXVALUE 范围值的使用,MAXVALUE 相当于一个比任何值都大的值。
举例,创建一个范围分区表callinfo,用来记录用户的2022年的电话通讯信息,包括主叫号码、被叫号码、通话时间和时长,并且根据季度进行分区。
CREATE TABLE callinfo(
caller CHAR(15),
callee CHAR(15),
time DATETIME,
duration INT
)
PARTITION BY RANGE(time)(
PARTITION p1 VALUES LESS THAN ('2022-04-01'),
PARTITION p2 VALUES LESS THAN ('2022-07-01'),
PARTITION p3 VALUES LESS THAN ('2022-10-01'),
PARTITION p4 VALUES EQU OR LESS THAN ('2022-12-31')
);
通过DM 管理工具查看该表已经创建成功:
一般来说,对于数字型或者日期型的数据,适合采用范围分区的方法;而对于字符型数据,取值比较固定的,则适合于采用 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 管理工具查看该表已经创建成功:
DM哈希分区提供了一种在指定数量的分区中均等地划分数据的方法,基于分区键的散列值将行映射到分区中。当用户向表中写入数据时,数据库服务器将根据一个哈希函数对数据进行计算,把数据均匀地分布在各个分区中。
举例,创建销售表sales01:
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
);
通过DM 管理工具查看该表已经创建成功:
在很多情况下,经过一次分区并不能精确地对数据进分类,这时需要多级分区表。
举例,创建一个产品销售记录表 sales02,记录产品的销量情况。由于产品需要按地点和销售时间进行统计,则可以对该表进行 LIST-RANGE 分区。
CREATE TABLE SALES02(
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 管理工具查看该表已经创建成功:
DM支持用ALTER TABLE ADD PARTITION语句将新分区增加到最后一个现存分区的后面。
举例,范围分区表callinfo现需要记录用户的2023年的第一季度的通讯信息,那么,需要为2023年第一季度增加一个分区:
ALTER TABLE callinfo ADD PARTITION p5 VALUES LESS THAN ('2023-4-1');
通过DM 管理工具查看p5分区已经添加:
对于范围分区,增加分区必须在最后一个分区范围值的后面添加,要想在表的开始范围或中间增加分区,应使用 SPLIT PARTITION 语句。
对于LIST分区,增加分区包含的离散值不能已存在于某个分区中。
例为LIST分区表sales添加一个分区管理沈阳和长春的销售情况:
ALTER TABLE sales ADD PARTITION p5 VALUES ('沈阳', '长春');
通过DM 管理工具查看该表已经新增了P5分区:
只能对范围分区和 LIST 分区增加分区,不能对哈希分区增加分区。
DM支持用ALTER TABLE DROP PARTITION语句将分区删除。
范围分区表callinfo现需要删除记录用户的2022年的第一季度的通讯信息,那么,只需删除 callinfo 的分区p1即可。
ALTER TABLE callinfo DROP PARTITION p1;
通过DM 管理工具查看该表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');
通过DM 管理工具查看callinfo表p2分区已经删除,p6分区已经添加。
通过交换分区实现分区p2和新建表callinfo_2022Q2的数据交换,表callinfo_2022Q2将得到2022年第二季度的通话记录,而分区p2数据将被清空。交换分区采用数据字典信息交换的技术,几乎不涉及IO操作,因此效率非常高。
仅范围分区和 LIST 分区支持交换分区,哈希分区表不支持。
举例,可将callinfo 的 2022第3季度和第4季度合并成一个分区:
ALTER TABLE callinfo MERGE PARTITIONS p3, p4 into partition p3_4;
通过DM 管理工具查看callinfo表p3和p4分区已经合并为p3_4分区:
ALTER TABLE语句的SPLIT PARTITION子句被用于将一分区中的内容重新划分成两个新的分区。当一个分区变得太大以至于要用很长时间才能完成备份、恢复或维护操作时,就应考虑做分割分区的工作,还可以用SPLIT PARTITION子句来重新划分I/O负载。
举例,将合并后的p3_4拆分为原两分区 p3和p4,分别记录2022年第三和第四季度的通话记录:
ALTER TABLE callinfo SPLIT PARTITION p3_4 AT ('2022-9-30') INTO (PARTITION p3, PARTITION p4);
通过DM 管理工具查看callinfo表p3_4分区已经拆分为p3和p4分区:
首先,本文通过在日常生活通过手机银行APP中查看流水账单表场景引入分区表,介绍了达梦数据库分区表概念、分区方式、及分区表优点;
其次,本文介绍了创建范围、LIST、哈希、多级分区表示例;
最后,本文介绍了分区表增删、交换、合并、拆分分区维护。
本文主要是抛砖引玉,关于达梦数据库分区表更多介绍请登录达梦数据库官网查看。
关于达梦数据库更多学习内容,欢迎访问达梦社区:
https://eco.dameng.com