达梦数据库分区表介绍

概述

本文将对达梦数据库分区表概念、创建、维护进行介绍。

1.分区表概念

1.1 分区表使用场景

近几年,随着移动支付快速发展,银行交易系统中【移动小微支付场景】使用越来越多,系统中流水账单表数据量巨大,往往上TB。

为了提高流水账单表查询等操作响应,该表设计可以采用分区表。反应到实际生活场景中,日常我们使用手机移动银行APP查个人账单,查询菜单里有按年、按月、按季度查询,流水账单表可以使用分区表进行多级分区,例如,季度、月、周。

总结:采用分区表有两个显示的收益:

对表读写响应更快

方便历史数据快速归档

1.2 DM分区表概念

达梦数据库对分区表设计有深度的思考,可以更好的支持业务发展。下面DM分区表概念:

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

1.3 DM 分区方式

达梦数据库 DM 支持对表进行水平分区。对于水平分区,提供以下分区方式:

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

1.4 分区表优点

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

2.创建分区表

2.1创建范围分区表

范围分区非常适用于数据按时间范围组织的表,不同的时间段的数据属于不同的分区。

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

在创建范围分区时,首先要指定分区列,即按照哪些列进行分区,然后为每个分区指定数据范围。范围分区支持 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 管理工具查看该表已经创建成功:

 

2.2创建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 管理工具查看该表已经创建成功:

 

2.3创建哈希分区表

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 管理工具查看该表已经创建成功:

2.4创建多级分区表 

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

举例,创建一个产品销售记录表 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 管理工具查看该表已经创建成功:

3.维护分区表

3.1增加分区

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 分区增加分区,不能对哈希分区增加分区。

3.2删除分区

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

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

ALTER TABLE callinfo DROP PARTITION p1;

通过DM 管理工具查看该表p1分区已经删除:

 

3.3交换分区

假设上文提到的 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 分区支持交换分区,哈希分区表不支持。

3.4合并分区

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

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

 通过DM 管理工具查看callinfo表p3和p4分区已经合并为p3_4分区:

3.5拆分分区

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

 

<think>好的,我现在要解决用户的问题:达梦数据库分区表如何实现ID自增。首先,我需要回顾达梦数据库的相关知识,特别是分区表和自增字段的实现方式。 用户提到的是分区表,而达梦支持多种分区方式,比如范围分区、列表分区等。自增字段通常是通过IDENTITY属性来实现的,这在达梦中类似于其他数据库的自动递增功能。但是,在分区表中使用自增ID可能会有一些需要注意的地方,比如分区键和自增字段的关系。 首先,我需要确认在达梦数据库中,是否允许在分区表上使用IDENTITY列。根据已有的知识,达梦的IDENTITY列是表级别的自增机制,每个表维护自己的自增序列。因此,在分区表中,每个分区可能共享同一个自增序列,这样插入数据时,无论插入到哪个分区,ID都会连续递增。这一点需要验证,是否有文档说明或者实际测试结果支持。 接下来,考虑具体的实现步骤。用户可能需要创建一个分区表,并指定某个字段为自增主键。例如,创建一个按范围分区的表,其中ID字段是自增的。这时候,创建表的SQL语句应该如何编写?需要确保IDENTITY关键字正确应用,并且分区子句正确设置。 可能的示例代码结构如下: CREATE TABLE 表名 ( ID INT IDENTITY(1,1) PRIMARY KEY, ...其他字段... ) PARTITION BY RANGE (分区键) ( PARTITION p1 VALUES LESS THAN (值), PARTITION p2 VALUES LESS THAN (值), ... ); 这里需要注意,IDENTITY列通常不能作为分区键,因为分区键的值需要明确分配到不同的分区,而自增ID的值是自动生成的,可能导致不可控的分区分配。因此,分区键应该是另一个字段,比如时间字段或其他业务相关的字段。 此外,还需考虑自增ID在分布式系统或高并发插入时的性能问题,虽然这可能超出了当前问题的范围,但作为最佳实践,可能需要提醒用户注意自增字段可能成为性能瓶颈,尤其是在分区较多的情况下。 还需要检查达梦的文档,确认是否有关于分区表自增ID的特殊限制或注意事项。例如,是否每个分区有自己的自增序列,或者全局共享一个。如果是后者,那么插入不同分区时,ID会连续递增,这可能符合用户需求,也可能不符合,需要用户根据业务场景决定。 总结步骤应该是: 1. 创建表时定义ID字段为IDENTITY类型。 2. 指定合适的分区键(非自增字段)。 3. 确保分区策略正确,不影响自增ID的生成。 4. 插入数据测试,验证ID是否按预期自增,并且数据正确分布到各分区。 可能遇到的问题包括:分区键选择不当导致数据分布不均,或者自增ID与分区键的关系不符合业务逻辑。需要提醒用户根据实际需求设计分区策略,并测试验证。</think>在达梦数据库中实现分区表的ID自增,需结合**自增列(IDENTITY)**和**分区表**的特性。以下是分步实现方法: --- ### 一、核心原理 1. **自增列(IDENTITY)**:通过 `IDENTITY(起始值, 步长)` 语法实现字段自动递增。 2. **分区表**:将数据按规则(如范围、列表等)分布到不同物理分区,但逻辑上仍为一张表。 --- ### 二、实现步骤 #### 1. 创建分区表时定义自增列 ```sql -- 示例:按范围分区的自增ID表 CREATE TABLE user_data ( id INT IDENTITY(1,1), -- 自增ID,从1开始,步长1 name VARCHAR(50), create_time DATE, PRIMARY KEY (id, create_time) -- 主键需包含分区键(create_time) ) PARTITION BY RANGE(create_time) ( PARTITION p2023_01 VALUES LESS THAN ('2023-02-01'), PARTITION p2023_02 VALUES LESS THAN ('2023-03-01') ); ``` #### 2. 关键注意事项 - **分区键选择**: - 必须包含分区键字段(如 `create_time`),但自增列(`id`)**不能直接作为分区键**。 - 主键需包含分区键字段(达梦要求)。 - **ID连续性**: - 自增ID是表级全局唯一,跨分区连续递增。例如: - 插入分区 `p2023_01` 生成 `id=1` - 插入分区 `p2023_02` 生成 `id=2` --- ### 三、验证自增效果 ```sql -- 插入数据(无需指定id) INSERT INTO user_data (name, create_time) VALUES ('张三', '2023-01-15'); INSERT INTO user_data (name, create_time) VALUES ('李四', '2023-02-20'); -- 查询结果 SELECT * FROM user_data; ``` 输出: ``` id | name | create_time 1 | 张三 | 2023-01-15 2 | 李四 | 2023-02-20 ``` --- ### 四、扩展场景 #### 1. 分区间自增独立 若需不同分区独立自增ID,需手动管理(如通过计算规则生成ID): ```sql -- 示例:按月份拼接自增ID(如2023010001) CREATE TABLE user_data_custom ( id VARCHAR(20) PRIMARY KEY, name VARCHAR(50), create_time DATE ) PARTITION BY RANGE(create_time) (...); -- 通过触发器或程序生成自定义ID ``` #### 2. 重置自增序列 ```sql -- 修改表的自增列起始值 ALTER TABLE user_data MODIFY id IDENTITY(1000,1); ``` --- ### 五、总结 - **标准方案**:直接使用 `IDENTITY` 属性,适合全局连续ID场景。 - **定制方案**:通过业务逻辑生成ID,满足分区间独立自增需求。 - **性能优化**:分区键应选择高频查询字段(如时间),避免自增ID成为性能瓶颈。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值