背景: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 明显上升
即使没有设置 DEFAULT、NOT NULL,DM 仍然会对整表进行较重的结构处理。
三、关键发现: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 = 2 | 40 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 执行时间和锁表风险。