背景需求 近期项目中碰到一个问题,涉及到应用版本更新,每次更新,就需要对业务系统中上千个表进行增加列或删除列的操作,每个表数据量都比较大,对一个表增加一个列就需要几分钟,导致整个升级需要十几个小时,而同样的在oracle只需要半个小时完成,如果涉及到大版本更新,一次跟新就需要往表添加或删除多个字段,会导致升级时间不可控。 达梦有ALTER_TABLE_OPT参数可以对列操作进行优化。 参数详解 1 对于添加列,当设置INI参数ALTER_TABLE_OPT为1时,添加列采用查询插入实现,可能会导致ROWID的改变; 2 ALTER_TABLE_OPT 为 2 时,系统开启快速加列功能,对于没有默认值或者默认值为 NULL 的新列,系统内部会标记为附加列,能够达到瞬间加列的效果,此时记录 ROWID 不会改变,若有默认值且默认值不为NULL,则默认值的存储长度不能超过 4000 字节,此时仍旧采取查询插入实现; 3 ALTER_TABLE_OPT 为 3 时,系统会开启快速加列功能,允许指定新增列的默认值,系统会为该列设置附加列标记,查询表中已存在的数据时,会自动为记录设置追加列默认值,此时记录 ROWID 不会改变。 现本地进行测试,当ALTER_TABLE_OPT设置不同值时,增加列和删除列的效果 数据库版本 1-3-62-2023.11.27-209835-20067-SEC --创建测试表 drop table if exists emp; create table emp (eid int primary key identity(1,1),ename varchar(200),age int,hiredate date,deptno int); declare i int; begin for i in 1..5000000 loop insert into emp (ename,age,hiredate,deptno) select dbms_random.string('2',trunc(dbms_random.value(2,8))), trunc(dbms_random.value(1,100)), ADD_DAYS(sysdate(),dbms_random.value(-10000,-10)), trunc(dbms_random.value(1,6)) from dual; end loop; if mod(i,5000)=0 then commit; end if; end; 当默ALTER_TABLE_OPT认值0 时,执行时间如下 --增加字段 --删除字段 ALTER_TABLE_OPT=1时, 执行时间如下 sp_set_para_value(1,'ALTER_TABLE_OPT',1); --增加字段 --删除字段 ALTER_TABLE_OPT=2时,执行时间如下 sp_set_para_value(1,'ALTER_TABLE_OPT',2); --增加字段 --删除字段 ALTER_TABLE_OPT=3时,执行时间如下 sp_set_para_value(1,'ALTER_TABLE_OPT',3); --增加字段 --删除字段 ALTER_TABLE_OPT重新改成0 时,执行时间如下: sp_set_para_value(1,'ALTER_TABLE_OPT',0); 经过测试结果得到结论如下: 当只要ALTER_TABLE_OPT设置为3时,对于表添加列有非常明显的效果,但设置1,2,3时对删除表中列均没有效果,而且比默认值更慢。
标签:OPT,--,value,数据表,添加,TABLE,默认值,ALTER,达梦 From: https://www.cnblogs.com/fangzpa/p/17984648