达梦分布式集群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 风险评估与备份
- 停机窗口:重建大表需要时间,需申请业务低峰期或停机窗口。
- 空间检查:确保表空间有足够剩余空间容纳"原表 + 新表数据"(建议剩余空间 > 原表大小的 2 倍)。
- 逻辑备份:虽然保留了原表(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.常见问题与注意事项
- 主键限制:
达梦分布式表中,主键约束必须包含分区键列。如果原表主键不包含拟定的分区键,需要在重建时修改主键定义(例如将分区列加入联合主键),或者取消主键(需评估业务影响)。 - 自增列处理:
如果原表包含 IDENTITY 自增列,在分布式环境下需谨慎。
建议:在 DPC 环境中,尽量避免全局自增,改用序列(SEQUENCE)。 - 外键约束:
分布式环境下,跨节点的外键约束性能极差甚至不支持。
建议:在重建大表期间,暂时禁用或删除外键约束,由应用层保证数据完整性,或在同库同节点的小表间维持外键。 - 并行度选择:
PARALLEL(16) 并非固定值。在生产环境高峰期严禁使用高并行度。请在测试环境压测找到最佳线程数(通常为 (CPU核数 / 节点数) * 0.7)。 - 回滚方案:
若新表上线后发现严重问题,立即执行回滚:
①删除表
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等
达梦数据库应用开发专栏连接