达梦分布式集群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等
达梦数据库应用开发专栏连接

相关推荐
JMchen1232 小时前
自定义View性能优化:从60fps到120fps的进阶之路
android·经验分享·性能优化·kotlin·自定义view
走遍西兰花.jpg2 小时前
spark的shuffle原理及调优
大数据·分布式·spark
小邓睡不饱耶2 小时前
Spark 3.5.1 全栈实战指南:从环境部署到生产优化
大数据·分布式·spark
姚不倒3 小时前
三节点 TiDB 集群部署与负载均衡搭建实战
运维·数据库·分布式·负载均衡·tidb
前端技术4 小时前
【鸿蒙实战】从零打造智能物联网家居控制系统:HarmonyOS Next分布式能力的完美诠释
java·前端·人工智能·分布式·物联网·前端框架·harmonyos
aini_lovee4 小时前
33节点配电网分布式发电(DG)最优分布MATLAB实现
分布式·matlab·wpf
不爱编程的小陈4 小时前
自研基于Raft的高性能分布式KV存储系统(一)
分布式
珠海西格4 小时前
聚焦痛点|分布式光伏消纳困境的三大表现及红区治理难点
服务器·网络·分布式·安全·区块链
Vic101014 小时前
java的分布式协议
java·开发语言·分布式