oracle column default remove,Oracle 12c column add default value功能增强

前几日晚,某核心应用负责人准备进行上线操作前打来一个确认电话,咨询了一个Oracle 11g 表添加default值的问题,询问是否有何影响,听完他的描述后,简单跟他描述完原理后,建议他取消此上线操作,否则会造成核心应用严重的性能问题,但是此问题再Oracle 12c新特性中已得到很大改进,对性能的影响已经降到最低。

11g情况下,可以看到,增加一个带有default值的并且没有添加非空约束的列,需要分钟级别(与表数据量有直接关系),完成时间会随着数据量的增加而耗时变长。

4ffb96ca1bc80d676375b1ef3d8a623f.png

会话2,我们在执行alter table时会造成读写阻塞,等待library cache lock

SID=916会话被阻塞

fe446454fa6438aa80a5fb0b6c2cdb17.png

SID=346会话被阻塞:

6db6f37bb3833c15a2c082c04d22ea99.png

所以在此期间内产生的应用事务,查询均会被阻塞,如果TABLE量级比较大,会造成更严重的性能问题,因为11g在添加DEFAULT值且没有非空约束时,在更新数据字典的同时仍要更新表中全部已有记录值,我们从segment大小与10046 event trace文件中可以得到论证。

e266eead2f206cf0ac4a633ee3688c94.png

f4d29238416323e475dae753f2106368.png

但是11g新提供了一种新的方式,如果添加一个带有默认值的非空列,则会很快完成,因为此方式不会更新现有行,只更新现有数据字典,我们在10046 event Trace文件中是找不到update table_name set语句的,只会看到针对sys.col基表中的数据进行插入,已有数据默认值从数据字典中获取,不更新现有列数据,随后数据才会写入具体segment中的block中,从而效率也有着非常大的提升。

c4024e04a96d399c7c999d2e2c0b16aa.png

我们再看一下Oracle 12c版本中,对不存在非空约束的列添加默认值时,采用同样的方式,只会更新数据字典,之后新数据才会更新,不会update之前现有列数据,效率非常高。

70bd2bb2eabac6432fd5e7242cab9f39.png

01258b97c7ee667574276647d6c95bd9.png

从执行计划角度来看,如果不更新列,读取数据时会有nvl或者decode函数的开销

(1) 11g add defualt

3295e858593e00de55fd291cc22d4a42.png

(2) 11g add default not null,会有NVL函数进行转换,

dddecbf514a5534da8578ac8ebc8dad7.png

(3)12c add defualt,同样会有DECODE函数进行转换,是否从数据字典中获取还是从具体含有值的block中读取。

d33e9c3ce163d362f66507bee3e416b0.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值