
最近项目上刚好遇到一个业务需求,需求说明如下。
情况:多张大表含已有字段上百个,需求在线增加字段(alter table xxx add column);
问题:开发人员测试环境增加一个字段耗时7分钟,数据量仅仅2千万;
难点:生产环境数据量7千万,业务为7*24小时高并发。
参数名 | 缺省值 | 属性 | 说明 |
ALTER_TABLE_OPT | 0 | 动态,会话级 | 是否对加列、修改列、删除列操作进行优化,0:全部不优化;1:全部优化;2:打开快速加列,对于删除列和修改列与1等效;3: 打开快速加列,允许指定快速列默认值,其他功能与2时相同 |
--查询目前值SELECT PARA_NAME,PARA_VALUE,FILE_VALUE FROM V$DM_INIWHERE PARA_NAME='ALTER_TABLE_OPT';--修改该参数为3SP_SET_PARA_VALUE(1,'ALTER_TABLE_OPT',3);--或ALTER SYSTEM SET 'ALTER_TABLE_OPT'=3 BOTH;
1)模拟600万数据的基础表
create table t_objects asselect level logid, * from sysobjectsconnect by rownum <=180000;beginfor i in 1..5loopinsert into t_objectsselect * from t_objects;commit;end loop;end;
(2)增加列无默认值时,ALTER_TABLE_OPT不同取值时的效率测试。
SQL> show parameter ALTER_TABLE_OPT行号 PARA_NAME PARA_VALUE---------- --------------- ----------1 ALTER_TABLE_OPT 0SQL> select count(*) from t_objects;行号 COUNT(*)---------- --------------------1 5995562SQL> alter table t_objects add column logtime datetime;操作已执行已用时间: 00:00:41.351. 执行号:5104.SQL> alter table t_objects drop column logtime;操作已执行已用时间: 00:00:40.518. 执行号:5105.
SQL> alter session set 'ALTER_TABLE_OPT'=1;SQL> alter table t_objects add column logtime datetime;操作已执行已用时间: 00:00:30.657. 执行号:5108.SQL> alter table t_objects drop column logtime;操作已执行已用时间: 00:00:30.152. 执行号:5109.
SQL> alter session set 'ALTER_TABLE_OPT'=2;SQL> alter table t_objects add column logtime datetime;操作已执行已用时间: 30.249(毫秒). 执行号:5111.SQL> alter table t_objects drop column logtime;操作已执行已用时间: 00:00:28.772. 执行号:5112.
SQL> alter session set 'ALTER_TABLE_OPT'=3;SQL> alter table t_objects add column logtime datetime;操作已执行已用时间: 18.768(毫秒). 执行号:5114.SQL> alter table t_objects drop column logtime;操作已执行已用时间: 00:00:29.880. 执行号:5115.
3)增加列有默认值时,ALTER_TABLE_OPT不同取值时的效率测试。
SQL> alter session set 'ALTER_TABLE_OPT'=0;SQL> alter table t_objects add column logtime datetime default sysdate;操作已执行已用时间: 00:00:41.261. 执行号:5117.SQL> alter table t_objects drop column logtime;操作已执行已用时间: 00:00:41.453. 执行号:5118.
SQL> alter session set 'ALTER_TABLE_OPT'=1;SQL> alter table t_objects add column logtime datetime default sysdate;操作已执行已用时间: 00:00:34.462. 执行号:5120.SQL> alter table t_objects drop column logtime;操作已执行已用时间: 00:00:33.902. 执行号:5121.
SQL> alter session set 'ALTER_TABLE_OPT'=2;SQL> alter table t_objects add column logtime datetime default sysdate;操作已执行已用时间: 00:00:29.403. 执行号:5123.SQL> alter table t_objects drop column logtime;操作已执行已用时间: 00:00:27.927. 执行号:5124.
SQL> alter session set 'ALTER_TABLE_OPT'=3;SQL> alter table t_objects add column logtime datetime default sysdate;操作已执行已用时间: 40.009(毫秒). 执行号:5126.SQL> alter table t_objects drop column logtime;操作已执行已用时间: 00:00:29.169. 执行号:5127.
1)对于ALTER TABLE添加列,ALTER_TABLE_OPT为3的情况下,不管新增列有没有默认值,效率都是最快的(毫秒级)。
2)对于ALTER_TABLE_OPT为0的情况,大表新增和删除列都是最慢的。
3)ALTER_TABLE_OPT为1,2,3的情况下,新增列都有不同程度的效率提升,删除列的也有小幅的效率提升。新增列无默认值的情况下,ALTER_TABLE_OPT为2和3效率都比较高(毫秒级),新增列有默认值的情况下,仅ALTER_TABLE_OPT为3时最快(毫秒级)。
4)对于删除列,ALTER_TABLE_OPT为0时效率最低,ALTER_TABLE_OPT为1,2,3时有小幅的效率提升(提升20%-30%)。
5)对于生产系统,如涉及在大表使用以上方法添加列,请联系达梦数据库技术服务团队,在其相关建议下进行操作。
以上为本期分享,希望能带给大家帮助。想要了解更多往期干货,可访问页面最下方#达梦技术干货攻略#合集或下方相关分享。
相关分享:
【干货攻略】达梦数据库客户端查询SYSDATE慢8小时解决办法
【开班通知】DM8-DCP线上培训班招生中(2024年02月26日开班)
【开班通知】 DM8-DCA线上培训班招生中(2024年02月28日开班)

文章转载自达梦E学,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




