达梦分布式集群DPC_分区表重建与性能优化操作指南_yxy

达梦分布式集群DPC_分区表重建与性能优化操作指南_yxy

  • [1 背景介绍](#1 背景介绍)
  • [2 实施前准备](#2 实施前准备)
    • [2.1 识别目标大表](#2.1 识别目标大表)
    • [2.2 分析高频 SQL 与执行计划](#2.2 分析高频 SQL 与执行计划)
    • [2.3 风险评估与备份](#2.3 风险评估与备份)
  • [3 分区表重建步骤](#3 分区表重建步骤)
    • [步骤一 重命名原表(保留现场)](#步骤一 重命名原表(保留现场))
    • [步骤二 建新表](#步骤二 建新表)
    • [步骤三 并行迁移数据](#步骤三 并行迁移数据)
    • [步骤四 重建索引+备注+权限+表上其他对象](#步骤四 重建索引+备注+权限+表上其他对象)

1 背景介绍

在将单机数据库或其他异构数据库迁移至达梦分布式集群(DMDPC)后,部分业务系统出现了严重的性能下降问题。主要原因如下:

1.默认分区策略局限:

迁移工具或默认建表语句通常将表的第一列作为 Hash 分区键。

2.数据倾斜与跨节点交互:

若第一列并非高频查询条件或关联 Join 列,导致大量查询无法利用分区裁剪,引发全集群扫描;同时,多表关联时因分区键不一致,导致大量的数据重分布,严重消耗网络带宽和计算资源。

3.分布式特性失效:

未能发挥 DPC "本地计算、减少网络传输"的核心优势。

为解决上述问题,达到迁移后sql执行耗时急剧缩短,并质变,需对核心大表进行分区表重建,将分区键调整为高频过滤列或关联列。

2 实施前准备

在执行重建操作前,必须完成以下分析与准备工作,严禁盲目操作。

2.1 识别目标大表

通过系统视图或监控工具,找出数据量大且查询频繁的表。

matlab 复制代码
-- 查询模式下的大表
select table_rowcount(owner,table_name) hanshu,table_used_space(owner,table_name)/1024.0/1024/1024*page GB,
*from dba_tables where owner='模式名' order by GB desc;

2.2 分析高频 SQL 与执行计划

通过活动会话或开启sql日志,分析典型 SQL

matlab 复制代码
--动态查询正在数据库中执行的sql耗时
select datediff(ss,last_recv_time,sysdate) ss,dbms_lob.substr(sf_get_session_sql(sess_id)),sess_id,substr(clnt_ip,8,13) from v$sessions where state='ACTIVE' order by 1 desc; 


--dmdpc
select sf_get_ep_seqno(rowid) zdh,INSTANCE_NAME 执行节点,datediff(ss,last_recv_time,sysdate) "执行耗时(s)",dbms_lob.substr(sf_get_session_sql(sess_id)) 执行sql,USER_NAME,sess_id,substr(clnt_ip,8,13) from gv$sessions where state='ACTIVE'  order by 3 desc; 

2.3 风险评估与备份

  1. 停机窗口:重建大表需要时间,需申请业务低峰期或停机窗口。
  2. 空间检查:确保表空间有足够剩余空间容纳"原表 + 新表数据"(建议剩余空间 > 原表大小的 2 倍)。
  3. 逻辑备份:虽然保留了原表(bak),但建议在操作前对关键表进行一次逻辑备份(dexp)。

3 分区表重建步骤

本方案采用 "原地_rename -> 新建分区表 -> 并行导入数据 -> 验证 -> 切换" 的策略,最大限度减少数据丢失风险并提升效率。

假设场景:

原表名:表1

新分区键:表1_DATE (按日期范围分区) 或 表1_ID (按哈希分区)

所属模式:模式1

步骤一 重命名原表(保留现场)

matlab 复制代码
-- 语法:ALTER TABLE 原表名 RENAME TO 备份表名;
ALTER TABLE 模式1.表1 RENAME TO 表1.BAK_20260310;

注意:此时原数据仍在,但业务应用访问 ORDERS 将报错,请确保已在维护窗口内。

步骤二 建新表

① 创建"HASH"分区表(最常见) 适用于高并发点查或 Join 关联

matlab 复制代码
--创建一个默认分区数的HASH分区表,标红为核心
CREATE TABLE "模式1"."新表名"
(
"ID" VARCHAR2(22) NOT NULL,
"NAME" VARCHAR2(36) NOT NULL,
"SFZH" VARCHAR2(64) NOT NULL)
PARTITION BY HASH(ID) PARTITIONS DEFAULT;

② 创建"范围+HASH"的二级分区表

matlab 复制代码
--创建一个范围+HASH分区表,标红为核心,范围分区数可以自己修改配置
CREATE TABLE "模式1"."新表名"
(
"ID" VARCHAR2(22) NOT NULL,
"NAME" VARCHAR2(36) NOT NULL,
"DATE1" TIMESTAMP(0) NOT NULL)
PARTITION BY RANGE("DATE1")
SUBPARTITION BY HASH("ID") SUBPARTITION TEMPLATE
SUBPARTITIONS DEFAULT
(
PARTITION P201001  VALUES LESS THAN(DATETIME'2010-01-01 00:00:00'),
PARTITION P201002  VALUES LESS THAN(DATETIME'2020-01-01 00:00:00'),
PARTITION P201003  VALUES LESS THAN(DATETIME'2025-01-01 00:00:00'),
PARTITION P201004  VALUES LESS THAN(DATETIME'2026-01-01 00:00:00'),
PARTITION P201005  VALUES LESS THAN(DATETIME'2026-03-01 00:00:00'),
PARTITION  "PMAX"  VALUES LESS THAN(MAXVALUE));

③创建"范围"一级分区表(适用于时间范围查询)

matlab 复制代码
--创建一个范围分区表,标红为核心,范围分区数可以自己修改配置
CREATE TABLE "模式1"."新表名"
(
"ID" VARCHAR2(22) NOT NULL,
"NAME" VARCHAR2(36) NOT NULL,
"DATE1" TIMESTAMP(0) NOT NULL)
PARTITION BY RANGE("DATE1")
(
PARTITION P201001  VALUES LESS THAN(DATETIME'2010-01-01 00:00:00'),
PARTITION P202001  VALUES LESS THAN(DATETIME'2020-01-01 00:00:00'),
PARTITION P202501  VALUES LESS THAN(DATETIME'2025-01-01 00:00:00'),
PARTITION P202501  VALUES LESS THAN(DATETIME'2026-01-01 00:00:00'),
PARTITION P202603  VALUES LESS THAN(DATETIME'2026-03-01 00:00:00'),
PARTITION  "PMAX"  VALUES LESS THAN(MAXVALUE));

注意

关键点:在 DPC 中,主键(Primary Key)或唯一索引必须包含分区键。

其他分区方式创建方式同理

步骤三 并行迁移数据

利用达梦的并行提示(Hint)加速数据插入过程。此步骤耗时最长,取决于数据量和硬件资源。

matlab 复制代码
-- 执行并行插入
INSERT /*+ PARALLEL(16) */ INTO 模式1.新表1 
SELECT /*+ PARALLEL(16) */  * FROM 模式1.备份表1;

-- 提交事务
COMMIT;

步骤四 重建索引+备注+权限+表上其他对象

数据导入完成后,需重建表上所有对象,并收集统计信息,以便优化器生成正确的执行计划。

注意:所有对象可以右键表点属性后查看

matlab 复制代码
--更新整个模式统计信息
DBMS_STATS.GATHER_SCHEMA_STATS('用户名',100,TRUE,'FOR ALL COLUMNS SIZE AUTO');

--更新单独某张表
DBMS_STATS.GATHER_TABLE_STATS ('用户名', '表名',null,100,false,'FOR ALL COLUMNS SIZE AUTO');      

4.常见问题与注意事项

  1. 主键限制:
    达梦分布式表中,主键约束必须包含分区键列。如果原表主键不包含拟定的分区键,需要在重建时修改主键定义(例如将分区列加入联合主键),或者取消主键(需评估业务影响)。
  2. 自增列处理:
    如果原表包含 IDENTITY 自增列,在分布式环境下需谨慎。
    建议:在 DPC 环境中,尽量避免全局自增,改用序列(SEQUENCE)。
  3. 外键约束:
    分布式环境下,跨节点的外键约束性能极差甚至不支持。
    建议:在重建大表期间,暂时禁用或删除外键约束,由应用层保证数据完整性,或在同库同节点的小表间维持外键。
  4. 并行度选择:
    PARALLEL(16) 并非固定值。在生产环境高峰期严禁使用高并行度。请在测试环境压测找到最佳线程数(通常为 (CPU核数 / 节点数) * 0.7)。
  5. 回滚方案:
    若新表上线后发现严重问题,立即执行回滚:
    ①删除表
    DROP TABLE 模式名1.新表;
    ② 恢复原名
    ALTER TABLE 模式名1.旧表 RENAME TO 模式名1.表1;
    ③ 恢复业务

更多其他数据库相关专栏:

1.数据库优化

数据库优化基本思路、索引详解、执行计划、统计信息、CBO原理、单表优化、多表优化、分布式优化、子查询、优化案例等
数据库优化(sql优化)专栏连接

2.达梦分布式数据库:

部署详细步骤(DEM)、备份还原实战、核心特性理解、使用心得、表分区方式详细介绍、表分区最佳实践、DPC架构详解等
达梦分布式DPC专栏连接

3.应用开发类

jdbc、hibernate、ibatis、mybatis、MyBatis-Plus、Spring、中间件mycat、Sharding-JDBC等
达梦数据库应用开发专栏连接

相关推荐
天天喝旺仔1 天前
Docker 镜像瘦身实战:多阶段构建把体积缩小 90%
运维·后端·ci/cd·docker·云原生·容器·性能优化
Lost of 程序猿1 天前
ASP.NET Core Saga 分布式事务深度实战:备件采购跨服务长流程,如何保证“要么全成,要么全回“
分布式·后端·asp.net
XiYang-DING1 天前
地图城市缓存优化:ApplicationReadyEvent + Caffeine + Redis + Redisson 分布式锁
redis·分布式·缓存
呆呆敲代码的小Y1 天前
【游戏开发】xLua 性能优化技巧
junit·性能优化·lua·xlua
2601_962175661 天前
RabbitMQ 的工作模式
分布式·rabbitmq
raindayinrain1 天前
深入理解Linux内核--系统调用,性能优化
linux·性能优化·系统调用·返回值·入参·内核态用户态地址访问
youngerwang1 天前
【WSL2 VHDX 文件格式深度研究报告(开发 + 性能优化向)】
性能优化·wsl·vhdx·文件格式解析
头茬韭菜1 天前
图解 Fluss(四):分布式协调 —— 选举、副本状态机与
分布式·fluss
weixin_431600441 天前
前端数据埋点(7):Web Vitals——页面慢不慢,不是再包一层 fetch
前端·性能优化·sentry·数据埋点
2601_962218612 天前
万象生鲜系统全链路溯源一码查询技术实现食材来源可查
分布式·微服务·云原生·架构