转载自:http://www.itpub.net/forum.php?mod=viewthread&tid=1083259&highlight=

给一个大表增加一个字段,给怎样操作。
Author: Kewin
Date: 2008-11-7

背景:
有个100万数据的TABLE:
SQL> desc t2
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
OWNER                                     NOT NULL VARCHAR2(30)
OBJECT_NAME                               NOT NULL VARCHAR2(30)
SUBOBJECT_NAME                                     VARCHAR2(30)
OBJECT_ID                                 NOT NULL NUMBER
DATA_OBJECT_ID                                     NUMBER
OBJECT_TYPE                                        VARCHAR2(18)
CREATED                                   NOT NULL DATE
LAST_DDL_TIME                             NOT NULL DATE
TIMESTAMP                                          VARCHAR2(19)
STATUS                                             VARCHAR2(7)
TEMPORARY                                          VARCHAR2(1)
GENERATED                                          VARCHAR2(1)
SECONDARY                                          VARCHAR2(1)
需要添加一个字段(KONG INT DEFAULT 100)
在如何修改,需要注意什么细节。

模拟测试:
如果有事务在TABLE上,那ALTER 语句执行失败。因为DML语句会加共享锁在table上,而ALTER需要排他锁。故alter失败。
SQL> alter table t2 add (kong int );
alter table t2 add (kong int )
*
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified

Elapsed: 00:00:00.00
那只能rollback transaction 或者kill session;
直接去添加一个字段,注意没有加上缺省值。
SQL> /

Table altered.

Elapsed: 00:00:00.04
执行的速度很快。在掩耳不及迅雷情况执行完毕。
这时可以DUMP BLOCK,看到数据块中的记录没有新添加的字段。(只是执行DDL,修改table的定义)
那这时删除一个字段呢?
SQL> alter table t2 drop column kong;

Table altered.

Elapsed: 00:00:11.42
可以想象,这是做了一个全表扫描。找到kong 字段,把内容搽去。
如果在ALTER中加上了缺省值,那又会怎样?
来来来,上楼上。一起去看看(易中天的语录)

SQL> alter table t2 add (kong int default 10);

Table altered.

Elapsed: 00:01:34.34
可以看到执行时间是1分钟34秒。而同时其他session执行的sql只能被等待。

SQL> select * from v$lock;

ADDR             KADDR                   SID TY        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK
---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
07000000FDDF5C60 07000000FDDF5DD8          9 TX     458782         60          6          0         25          0
07000000FDC5AB28 07000000FDC5AB50          9 TM       6291          0          6          0         25          0
07000000FB9B8308 07000000FB9B8328         13 CU   32906288  117440513          6          0         21          0

(忽略无关的lock。SID=13, 执行了DDL; SID=9,执行DML)
这里有个问题,SID=9, 拥有 table的锁;sid=13也拥有table的锁;那为什么sid=13 要执行那么长的时间,而sid=9 也要
LONG TIME,但是没有看到相关的阻塞。(这个没有阻塞,没有猜到理由)
在DDL时,ORACLE会当作一个原子来执行,sid=13已经修改了数据表的定义,接着更改block的数据;而SID=9只能等待,等待sid=13执行完毕。在SID=9的session可以看到SID=13执行后的结果:
SQL> select * from t2
  2  where owner='KONG2' AND ROWNUM < 2;

OWNER                          OBJECT_NAME
------------------------------ ------------------------------
SUBOBJECT_NAME                  OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE
------------------------------ ---------- -------------- ------------------
CREATED         LAST_DDL_TIME   TIMESTAMP           STATUS  T G S       KONG
--------------- --------------- ------------------- ------- - - - ----------
KONG2                          T1
                                     6290           6290 TABLE
05-NOV-08       05-NOV-08       2008-11-05:22:15:13 VALID   N N N         10

如果在修改同时,加上缺省值,会阻塞其他session;那如果分来呢?先加字段,再加上缺省值。
SQL> alter table t2 add (kong int );

Table altered.

Elapsed: 00:00:00.03
SQL>
SQL> alter table t2 modify (kong default 2000);

Table altered.

Elapsed: 00:00:00.03
看到速度是很快。。。可是和前一个方法有什么区别吗?难道快就没有缺点?

还是有的:
1) 在ALTER sql中有带缺省值,ORACLE会直接刷新全部的记录。
2) 在ALTER sql中没有带缺省值,ORACLE只会影响到后来的记录。(明白快是有隐秘的秘诀)

在选择哪种方法时,要更加具体的情况来实施:是否有INDEX,是否在应用的高并发阶段,等等。

转载于:https://blog.51cto.com/zhang916/1153972

给一个大表增加一个字段,带默认值相关推荐

  1. 添加列oracle默认值,Oracle 11g增加列,并带默认值的新特性

    在Oracle 11g以前,如果要在一个大表中增加一列,并设置默认值,那将是一个非常悲剧的事情.有些时候不得不选择在线重定义功能来实现 Oracle 11g增加列,并带默认值的新特性 [日期:2014 ...

  2. oracle增加字段带默认值

    在oracle 11gR2版本中,对大表增加带默认值的字段,需要拆分成多个步骤,否则会长时间锁表.如下图: 对260万数据的表加带默认值的字段,执行超过2分钟. 我们的规范做法步骤为: (1)加字段 ...

  3. mysql修改表中某个字段的默认值

    Mysql中用SQL增加.删除字段,修改字段名.字段类型.注释,调整字段顺序总结 在网站重构中,通常会进行数据结构的修改,所以添加,删除,增加mysql表的字段是难免的,有时为了方便,还会增加修改表或 ...

  4. 数据库字段设置默认值

    1.UPDATE 表名  set  字段名= '默认值' WHERE 字段名is null 如:UPDATE item set  status= '0' WHERE status is null

  5. Android之实现Room升级需要给一个表增加一个字段

    1.需求 实现Room升级需要给一个表增加一个字段. 2.Room升级介绍 Room 持久化库中通过使用 Migration 类保存用户数据.每个 Migration 类指定起始版本和结束版本.在运行 ...

  6. mysql数据库表添加字段_mysql数据库怎么给表增加一个字段?

    mysql数据库给表增加一个字段的方法:可以使用"ALTER TABLE"语句来增加一个字段,语法格式"ALTER TABLE 表名 ADD 新字段名 数据类型 [约束条 ...

  7. MySQL把一个大表拆分多个表后,如何解决跨表查询效率问题

    MySQL把一个大表拆分多个表后,如何解决跨表查询效率问题 参考文章: (1)MySQL把一个大表拆分多个表后,如何解决跨表查询效率问题 (2)https://www.cnblogs.com/lili ...

  8. 在MySQL中如何有效的删除一个大表?

    在MySQL中如何有效的删除一个大表? Oracle大表的删除: http://blog.itpub.net/26736162/viewspace-2141248/ 在DROP TABLE 过程中,所 ...

  9. 中间表增加额外字段_如何定制分表中间件

    前言 一般来说,影响数据库最大的性能问题有两个,一个是对数据库的操作,一个是数据库中的数据太大.对于前者我们可以借助缓存来减少一部分读操作,针对一些复杂的报表分析和搜索可以交给 Hadoop 和 El ...

最新文章

  1. 关于如何在你的Web项目中实现对空间数据访问权限的控制(一)
  2. endnote 插入文献总变成乱码_维普文献导入Endnote中的乱码问题
  3. 微信小程序销毁某一注册函数_微信小程序云开发API 删除一条记录
  4. C++知识点 多态、静态多态、动态多态
  5. Spark内核解析1
  6. SharePoint Foundation 2013安装-1:先决条件准备
  7. 《Unity虚拟现实开发实战》——第1章,第3.1节虚拟现实设备集成的软件
  8. mysql带参数游标_mysql游标的使用
  9. 全国计算机二级公共基础知识电子版,全国计算机二级公共基础知识汇总.pdf
  10. Python基础教程:教你制作一个汇率换算程序
  11. 更改Pycharm的配置文件的存放路径
  12. 请注意!新办理的电话卡,有以下情况会导致“二次实名”!
  13. 《剑指offer》刷题——【链表】从尾到头打印链表
  14. vue3 不推荐使用index作为v-for遍历的key
  15. 找不到XMAP下载地址的进来
  16. 求俩向量角度 允许超过180度 python
  17. 安卓端哔哩哔哩下载文件存储处
  18. 【深度学习】【积分梯度】深度网络的公理归因(Axiomatic Attribution for Deep Networks)
  19. phpstudy-linux您修改了面板程序,这是不允许的 请进入服务器命令行输入xp查看修复方法 +解决方法
  20. 导数和梯度,切线和法向量

热门文章

  1. 2020-08-16:数据任务是怎么优化的?(数据倾斜,参数相关调节)
  2. 【推荐算法】双塔模型介绍
  3. DevOps方法论掌握这四点,实践出真知
  4. 小红书运营模式是怎样的?弄清楚小红书底层逻辑
  5. CSS 内边距 padding 属性
  6. 願いをドラッグの若返り薬)作者紫猫刘程
  7. 【华人学者风采】黄维 西北工业大学
  8. PPOJ1100: 诡异的楼梯
  9. 5.1劳动节|致敬每一位数字安全劳动者
  10. Linux-Ubuntu-4-软件安装