给一个大表增加一个字段,带默认值
转载自: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
给一个大表增加一个字段,带默认值相关推荐
- 添加列oracle默认值,Oracle 11g增加列,并带默认值的新特性
在Oracle 11g以前,如果要在一个大表中增加一列,并设置默认值,那将是一个非常悲剧的事情.有些时候不得不选择在线重定义功能来实现 Oracle 11g增加列,并带默认值的新特性 [日期:2014 ...
- oracle增加字段带默认值
在oracle 11gR2版本中,对大表增加带默认值的字段,需要拆分成多个步骤,否则会长时间锁表.如下图: 对260万数据的表加带默认值的字段,执行超过2分钟. 我们的规范做法步骤为: (1)加字段 ...
- mysql修改表中某个字段的默认值
Mysql中用SQL增加.删除字段,修改字段名.字段类型.注释,调整字段顺序总结 在网站重构中,通常会进行数据结构的修改,所以添加,删除,增加mysql表的字段是难免的,有时为了方便,还会增加修改表或 ...
- 数据库字段设置默认值
1.UPDATE 表名 set 字段名= '默认值' WHERE 字段名is null 如:UPDATE item set status= '0' WHERE status is null
- Android之实现Room升级需要给一个表增加一个字段
1.需求 实现Room升级需要给一个表增加一个字段. 2.Room升级介绍 Room 持久化库中通过使用 Migration 类保存用户数据.每个 Migration 类指定起始版本和结束版本.在运行 ...
- mysql数据库表添加字段_mysql数据库怎么给表增加一个字段?
mysql数据库给表增加一个字段的方法:可以使用"ALTER TABLE"语句来增加一个字段,语法格式"ALTER TABLE 表名 ADD 新字段名 数据类型 [约束条 ...
- MySQL把一个大表拆分多个表后,如何解决跨表查询效率问题
MySQL把一个大表拆分多个表后,如何解决跨表查询效率问题 参考文章: (1)MySQL把一个大表拆分多个表后,如何解决跨表查询效率问题 (2)https://www.cnblogs.com/lili ...
- 在MySQL中如何有效的删除一个大表?
在MySQL中如何有效的删除一个大表? Oracle大表的删除: http://blog.itpub.net/26736162/viewspace-2141248/ 在DROP TABLE 过程中,所 ...
- 中间表增加额外字段_如何定制分表中间件
前言 一般来说,影响数据库最大的性能问题有两个,一个是对数据库的操作,一个是数据库中的数据太大.对于前者我们可以借助缓存来减少一部分读操作,针对一些复杂的报表分析和搜索可以交给 Hadoop 和 El ...
最新文章
- 关于如何在你的Web项目中实现对空间数据访问权限的控制(一)
- endnote 插入文献总变成乱码_维普文献导入Endnote中的乱码问题
- 微信小程序销毁某一注册函数_微信小程序云开发API 删除一条记录
- C++知识点 多态、静态多态、动态多态
- Spark内核解析1
- SharePoint Foundation 2013安装-1:先决条件准备
- 《Unity虚拟现实开发实战》——第1章,第3.1节虚拟现实设备集成的软件
- mysql带参数游标_mysql游标的使用
- 全国计算机二级公共基础知识电子版,全国计算机二级公共基础知识汇总.pdf
- Python基础教程:教你制作一个汇率换算程序
- 更改Pycharm的配置文件的存放路径
- 请注意!新办理的电话卡,有以下情况会导致“二次实名”!
- 《剑指offer》刷题——【链表】从尾到头打印链表
- vue3 不推荐使用index作为v-for遍历的key
- 找不到XMAP下载地址的进来
- 求俩向量角度 允许超过180度 python
- 安卓端哔哩哔哩下载文件存储处
- 【深度学习】【积分梯度】深度网络的公理归因(Axiomatic Attribution for Deep Networks)
- phpstudy-linux您修改了面板程序,这是不允许的 请进入服务器命令行输入xp查看修复方法 +解决方法
- 导数和梯度,切线和法向量