Oracle 11.2.0.4.0版本下大表添加默认值字段影响因素

 

Oracle 11.2.0.4.0版本下大表添加默认值字段影响因素

 

最近生产有个需求,要对大表添加一个字段并且带有默认值9,然后再将默认值更改为0。

11g以后,添加带有默认值的字段,如果有NOT NULL限制是非常快的。

12c以后,不用有NOT NULL也可以非常快的完成。

但是我在测试环境测试了下,发现添加速度非常慢,无论是否带有NOT NULL限制。

表:

复制代码
16:32:35 SYS@zkm(1012)> desc zkm.test
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER(38)

16:42:00 SYS@zkm(1012)> select count(*) from zkm.test;

  COUNT(*)
----------
   1920001

Elapsed: 00:00:00.04
复制代码

 

添加字段name并带有默认值'oracle',非常慢。

alter table zkm.test add name varchar2(20) default 'oracle' not null;

 

查看mos发现,11g的这个新特性受到隐含参数"_ADD_COL_OPTIM_ENABLED"的影响。

默认该参数值为true,表示启用。

看了下我的环境,这个参数被设置为false。

于是,尝试在会话级别将此参数改为true后,添加就特别快。

复制代码
17:13:20 SYS@zkm(1012)> alter session set "_ADD_COL_OPTIM_ENABLED"=true;

Session altered.

Elapsed: 00:00:00.00
17:13:32 SYS@zkm(1012)> alter table zkm.test add name varchar2(20) default 'oracle' not null;

Table altered.

Elapsed: 00:00:00.86
17:13:49 SYS@zkm(1012)> alter table zkm.test drop column name;

Table altered.

Elapsed: 00:00:04.51
17:14:18 SYS@zkm(1012)> alter table zkm.test add name varchar2(20) default 'oracle';
卡住......
复制代码

12c后就不要求需要NOT NULL限制了,不过也是受到参数"_add_nullable_column_with_default_optim"影响。 

可以使用以下形式的 SQL 检查哪些列已添加并启用优化:

select owner, object_name, name
from dba_objects, col$
where bitand(col$.PROPERTY,1073741824)=1073741824
and object_id=obj#;

 

经测试,临时更改"_ADD_COL_OPTIM_ENABLED"为true来加快添加NOT NULL默认值字段的速度是不影响后续操作的。

包括后续更改默认值为其他的值,使用数据泵导出表导入表。

 

 

参考链接

Init.ora Parameter "_ADD_COL_OPTIM_ENABLED" [Hidden] Reference Note (文档 ID 1492674.1)

Hidden Column "SYS_NC000XX$" Being Added When A New Column Is Added To The Table. (文档 ID 2277937.1)

Oracle DDL性能改进-大表新增列行为分析

posted @   PiscesCanon  阅读(762)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2020-08-13 oracle慎用基于on commit刷新物化视图的方式(一)
点击右上角即可分享
微信分享提示