最近大家讨论到各类数据库在新增字段带默认值时是否会锁表的问题,发现Oracle在不同的版本其实是有对应优化的,更新了下之前的知识点。

主要考虑以下三种情形,例如:

  • 不加default:alter table t1 add tel varchar2(20);
  • default+not null:alter table t1 add tel varchar2(20) default '13888888888' not null;
  • 仅加default:alter table t1 add tel varchar2(20) default '13888888888' ;
加列方式 / 版本 11g之前 11g 12c
不加default 不需全表更新 不需全表更新 不需全表更新
default+not null 全表更新

不需全表更新
更新数据字典sys.col$中default$的值,另外在sys.ecol$中记录默认值,在查询要用到时直接读取

可由隐含参数_ADD_COL_OPTIM_ENABLED控制

不需全表更新
更新数据字典sys.col$中default$的值,另外在sys.ecol$中记录默认值,在查询要用到时直接读取

可由隐含参数_ADD_COL_OPTIM_ENABLED控制

仅加default 全表更新 全表更新 不需全表更新
更新数据字典sys.col$中default$的值,
在sys.ecol$中记录默认值,且较11g会记录更多信息,在查询要用到时直接读取

全表更新对大表意味着更长的锁表时间,更大的事务量,更大的undo占用量,更长的业务影响时间。在11g及之前,这都是一个需要谨慎考量的变更,而从12c开始,影响明显降低。

具体的原理很多文章都有通过10046 trace分析,可以参考:

Oracle 11g中 ADD COLUMN 功能增强 说明_oracle column after-CSDN博客

Oracle 如何给大表添加字段,并带有默认值 - 墨天轮

​​​​​oracle大表添加字段default经验分享_ITPUB博客

add column时default null的问题 – OracleBlog

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

ORACLE-BASE - DEFAULT Values for Table Columns : Enhancements in Oracle Database 12c Release 1 (12.1)

oracle column default remove,Oracle 12c column add default value功能增强_令和时代的柯南的博客-CSDN博客

ORACLE-BASE - DEFAULT ON NULL FOR INSERT AND UPDATE in Oracle Database 23c

</article>

[转帖]会长期锁表吗?Oracle add column default 在各版本的优化的更多相关文章

  1. Oralce进程信息查看,Oracle的锁表与解锁

    参考: oracle查看锁表进程,杀掉锁表进程 Oracle的锁表与解锁 查看锁表进程SQL语句: select * from v$session t1, v$locked_object t2 whe ...

  2. MySQL5.7之在线DDL不会锁表

    MySQL5.7在线修改varchar字段不在锁表,测试过程如下: mysql> select version(); +------------+ | version() | +-------- ...

  3. oracle 锁表问题

    oracle执行表数据更新的时候,会遇到锁表问题,比方说,会遇到这样的问题,主要原因是这张表被其他人占用,修改数据没有提交.oracle为了避免脏数据的产生,在其安全机制下,锁住该表. 执行如下操作, ...

  4. 查询Oracle锁表和解决方法

    Oracle数据库操作中,我们有时会用到锁表查询以及解锁和kill进程等操作,那么这些操作是怎么实现的呢?本文我们主要就介绍一下这部分内容.(1)锁表查询的代码有以下的形式:select count( ...

  5. Oracle数据库锁表及解锁进程

    下午代码迁移,更新数据库记录时for update语句无法执行,数据库被锁,KILL掉几个进程搞定. Oracle数据库操作中,我们有时会用到锁表查询以及解锁和kill进程等操作,那么这些操作是怎么实 ...

  6. Oracle锁表与解锁

    查看锁表语句:方法1:    select sess.sid,           sess.serial#,           lo.oracle_username,           lo.o ...

  7. Oracle的锁表与解锁

    Oracle的锁表与解锁 SELECT /*+ rule */ s.username, decode(l.type,'TM','TABLE LOCK', 'TX','ROW LOCK', NULL) ...

  8. oracle 查看锁表情况并处理锁表

    /* *locked *query locked object and analyse reason,kill it * */ select 'alter system kill session '' ...

  9. Oracle锁表(转载)

    锁定类型               行级锁               表级锁行级锁         ---- 行被排他锁定         ----在某行的锁被释放之前,其他用户不能修改此行    ...

  10. 查看Oracle是否锁表

    --Oracle数据库操作中,我们有时会用到锁表查询以及解锁和kill进程等操作,那么这些操作是怎么实现的呢?本文我们主要就介绍一下这部分内容. --(1)锁表查询的代码有以下的形式: select ...

随机推荐

  1. 部署堡垒机2——安装MySQL8.0.32或8.0.28+

    MySQL的三大版本 a)MySQL Enterprise Edition:企业版本(付费)b)MySQL Cluster CGE:高级集群版(收费)c)MySQL Community Server: ...

  2. 小姐姐用动画图解Git命令,一看就懂!

    无论是开发.运维,还是测试,大家都知道Git在日常工作中的地位.所以,也是大家的必学.必备技能之一.之前公众号也发过很多git相关的文章: Git这些高级用法,喜欢就拿去用!一文速查Git常用命令,搞 ...

  3. Java 并发编程(二 )Thread

    线程状态 线程一般的状态转换图如下: 在线程生命周期中存在的状态解释如下: New(初始化)状态 此时线程刚刚被实例化,可以通过调用 start() 方法来启动这个实例化的的线程,使其状态转变成为 R ...

  4. FlinkSQL实战开发

    FlinkSQL实战开发 1.基础知识 FlinkSQL分为Table API和SQL API,是架构于Flink Core之上用SQL予以方便快捷地进行结构化数据处理的上层库. 工作流程 SQL和T ...

  5. C++篇:第二章_运算符_知识点大全

    C++篇为本人学C++时所做笔记(特别是疑难杂点),全是硬货,虽然看着枯燥但会让你收益颇丰,可用作学习C++的一大利器 二.运算符 (一)运算符本身运用限制 %取余运算符要求运算数必须是整型,浮点数取 ...

  6. 教你如何基于MindSpore进行ChatGLM微调

    本文分享自华为云社区<基于MindSpore的ChatGLM微调>,作者: JeffDing . 基于MindSpore的ChatGLM微调 克隆Hugging Face模型 克隆chat ...

  7. 云小课|MRS基础操作之集群健康检查

    本文分享自华为云社区<云小课|MRS基础操作之集群健康检查>,作者:阅识风云. 阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视 ...

  8. CANN开发实践:4个DVPP内存问题的典型案例解读

    摘要:由于DVPP媒体数据处理功能对存放输入.输出数据的内存有更高的要求(例如,内存首地址128字节对齐),因此需调用专用的内存申请接口,那么本期就分享几个关于DVPP内存问题的典型案例,并给出原因分 ...

  9. CPU高速缓存与极性代码设计

    摘要:CPU内置少量的高速缓存的重要性不言而喻,在体积.成本.效率等因素下产生了当今用到的计算机的存储结构. 介绍 cpu缓存的结构 缓存的存取与一致 代码设计的考量 最后 CPU频率太快,其处理速度 ...

  10. Hudi自带工具DeltaStreamer的实时入湖最佳实践

    摘要:本文介绍如何使用Hudi自带入湖工具DeltaStreamer进行数据的实时入湖. 本文分享自华为云社区<华为FusionInsight MRS实战 - Hudi实时入湖之DeltaStr ...