DM 数据库百万级大表 ADD COLUMN 很慢?一个参数直接快50倍

6 阅读2分钟

背景:DM8 + 百万级业务表
结论先行:开启 ALTER_TABLE_OPT=2,大表加字段明显提速


一、问题背景

在 DM(达梦)数据库中,对一张 百万级数据量的业务表新增字段:

ALTER TABLE SA_BUSINESS_ENTITY.SP_INCOMING_AND_OUTGOING_SHIPMENTS
ADD SPECIFICATIONS_UNIT VARCHAR2(20);

这张表数据量情况:

  • 本地环境:297 万行
  • 线上环境:约 600 万行

原本只是新增一个可为空、无默认值的字段,但执行时间却明显偏慢。


二、问题现象

1️⃣ 默认情况下(未开启优化)

  • ADD COLUMN:≈ 42 秒

  • DROP COLUMN:≈ 48 秒

  • DDL 期间:

    • 表被锁
    • DML 阻塞
    • IO 明显上升

即使没有设置 DEFAULTNOT NULLDM 仍然会对整表进行较重的结构处理


三、关键发现:ALTER_TABLE_OPT 参数

在排查过程中,发现 DM 提供了一个 ALTER TABLE 相关的优化参数

ALTER_TABLE_OPT

该参数用于控制 ALTER TABLE 的执行策略,属于 动态参数,无需重启数据库。

参数说明(实测有效)

参数值含义
0默认策略(可能整表扫描/重写)
2启用 快速加列(Fast Add Column)

四、解决方案(重点)

✅ 在执行 ALTER TABLE 前,先开启优化参数

-- 开启 ALTER TABLE 快速加列优化
ALTER SYSTEM SET 'ALTER_TABLE_OPT' = 2;

然后再执行加字段操作:

ALTER TABLE SA_BUSINESS_ENTITY.SP_INCOMING_AND_OUTGOING_SHIPMENTS
ADD SPECIFICATIONS_UNIT VARCHAR2(20);

五、优化效果对比(实测)

场景执行时间
未设置参数42 s
设置 ALTER_TABLE_OPT = 240 ms

在相同表、相同字段定义下,
加字段速度明显提升,锁表时间显著减少


六、注意事项(非常重要)

1️⃣ 一定要在 ALTER TABLE 之前设置参数

ALTER SYSTEM SET 'ALTER_TABLE_OPT' = 2;
-- 再执行 ALTER TABLE

否则不会生效。


2️⃣ 该参数并非万能

在以下情况下,仍可能退化为慢路径:

  • 表字段很多、行很宽
  • 存在 LOB / 大 VARCHAR
  • 表经历过多次 DDL
  • 数据量极大(千万级)

但在 百万级常规业务表 上,收益非常明显


3️⃣ DROP COLUMN 依然很慢(正常现象)

即使开启该参数:

  • DROP COLUMN 通常仍是重操作
  • ADD COLUMN 更慢是 正常行为

七、最佳实践总结

在 DM 数据库中,对百万级表新增字段时:

  • ✅ 字段允许 NULL

  • ❌ 不要设置 DEFAULT

  • ❌ 不要加 NOT NULL

  • ✅ 执行前开启:

    ALTER SYSTEM SET 'ALTER_TABLE_OPT' = 2;
    
  • ✅ 低峰期执行

  • ✅ DDL 后及时收集统计信息


八、一句话总结(结论)

ALTER_TABLE_OPT = 2 是 DM 数据库中,大表 ADD COLUMN 的“救命参数”。
在不改业务、不建影子表的前提下,可以显著降低 DDL 执行时间和锁表风险。