暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 将默认值为空的列添加到大表中

ASKTOM 2019-10-11
349

问题描述

我正在添加许多具有默认值的列,这些列可以为空到大表中

例如

alter table big_table add (col1 varchar2(1) default 0, col2 varchar2(1) default 0);
复制


这需要很长时间才能完成,因为当提交ALTER表时,Oracle在幕后执行了一些递归SQL。

update big_table set col1 = '0', col2 = '0'
复制


从并行启用外键约束的经验来看,我做到了这一点;

alter session force parallel dml;
alter session force parallel query;
alter session force parallel ddl;
alter table big_table parallel;

-- now do my foreign key constraints => first enable novalidate, then validate

alter table big_table noparallel;
复制


以上工作并强制执行Oracle在验证要并行执行的FK约束时执行的递归SQL。

然而,应用相同的方法,我曾使用的启用FK约束并行添加NULLABLE列与默认值-它不工作,递归更新上面是拒绝去并行 (即使执行计划显示并行)。

我错过了一个 “把戏” 吗?还是在后来的Oracle、12c等版本中对此进行了改进?

如果我可以让递归更新并行,我知道那么ALTER会更快,因为作为一个单独的测试,我并行运行该更新,它确实并行完成了。

所有统计数据都是最新的。

专家解答

您可以在添加列时强制使用该列,以利用快速列添加。那以后让它成为可空的?

alter table big_table add ( 
  col1 varchar2(1) default 0 not null, 
  col2 varchar2(1) default 0 not null
);

alter table t 
  modify ( col1 null, col2 null );
复制

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

评论