oracle大表添加字段default经验分享

当oracle单表数据量上亿时,对表进行alter table aa add column_1 varchar2(2) defalut 'Y';时,效率及安全性是必须考虑的因素。

本帖以2亿的数据表aa举例:
alter table aa add column_1 varchar2(2) defalut 'Y';
Table altered
Executed in 3600 seconds
直接用了一个小时,而且在这过程中是加上了表级锁,也就是连查询都是会被等待的,这是相当危险的操作。

为什么会这样,原来oracle在执行上面语句时不仅要更新数据字典,还会刷新全部的记录。一次update 2 亿条数据当然需要一个小时,并且还会导致undo空间暴涨。

如果我们把更新数据字典和更新字段值分开,会不会好一点?
alter table aa add column_1 varchar2(2);
Table altered Executed in 0.016 seconds
alter table aa modify column_1 varchar2(2) defalut 'Y';
Table altered
Executed in 0.003 seconds

答案是快100万倍,那效果呢?经测试发现在第二种方法不会更新以前的数据,我们可以自己写一个匿名块循环update,一次commit 10000条,达到效率与安全的完美结合。

结论:alter table add 语句加上defalut时会刷新存量数据并产生表级锁,需慎用。特别是大表,生产环境,业务产生期间就应该禁止此操作。
改为add table add不带缺省值,接着来个alter table aa modify column_1 varchar2(2) defalut 'Y';更新存量数据可放到业务较少的凌晨跑。

时间: 2024-10-26 14:54:18

oracle大表添加字段default经验分享的相关文章

FuncADDColumn(为表添加字段)

用于为表添加字段.可以侦测表中有没有这字段.如果没有,添加该字段. /*author:nybtime   :2003/12/29fixtime :aim    :看表中是否有这个字段,如果没有,添加上input  : 调用:execute FuncADDColumn 'a','c','int'execute FuncADDColumn 'a','ddd','varchar(100)'*/CREATE   PROCEDURE FuncADDColumn@tablename  varchar(128

mysql给表添加字段的命令

  给表添加字段的命令: ? 1 alter table tableName add newColumn varchar(8) comment '新添加的字段' 在这句语句中需要注意的是,comment为注释,就像在java中//作用是一样的. comment后需要加单引号将注释引起来.

请教Oracle大表的处理方式

问题描述 RT.我用的是Oracle 10G RAC,一个表的字段非常多(包含一个BLOB字段),大约有60-70个字段左右,外键有10多个,现在的情况是,表里有80万条数据就很慢,并且这个表的更新非常频繁,这个表的数据会慢慢的达到3000万条,请问对此表用什么方式处理速度会快一些?问题补充:gaoran2008兄弟提到了分表的处理方式,我有空做个实验试试看,但是Oracle有表分区,不知道表分区对我提到的有没有大幅度的提升呢? 解决方案 是Oracle有表分区,不知道表分区对我提到的有没有大幅

Yii 2 创建 migration 给表添加字段的例子

使用 Yii 2 框架的 migration 也是挺方便的,现代 PHP 开发框架都具备这个特性,使用 migration 数据库迁移功能,对数据库进行操作,它的意义在于记录下数据库修改的版本,而且方便项目的部署,数据库的回滚,不需要手动操作线上的数据库. 创建一个 migration 执行 yii 命令: php yii migrate/create add_column_rsync_sh_to_conf_table 这样就生成了一个 migration 数据库迁徙文件. 我要给 Projec

Oracle删除表、字段之前判断表、字段是否存在_oracle

在Oracle中若删除一个不存在的表,如 "DROP TABLE tableName",则会提示: ORA-00942:表或视图不存在 若在程序中执行该语句则会报异常,这就需要我们在删除表前先判断该表是否存在,若存在则删除. DECLARE num NUMBER; BEGIN SELECT COUNT(1) INTO num FROM USER_TABLES WHERE TABLE_NAME = UPPER('tableName'); IF num > 0 THEN EXECUT

Oracle大表清理truncate .. reuse storage

最近需要清理一张大表,要求不能影响性能.在MySQL里边我们可以通过借助coreutils以及硬链接的方式来最小化I/O,Oracle也可以通过分批次回收空间来最小化I/O,到底如何,下面我们拭目以待. 一.TRUNCATE TABLE 语法 TRUNCATE TABLE [schema_name.]table_name [ PRESERVE MATERIALIZED VIEW LOG | PURGE MATERIALIZED VIEW LOG ] [ DROP STORAGE | REUSE

Oracle压缩表删除字段处理时的ORA-39726错误

今天在往一个压缩表增加一个字段可以增加成功,但在删除的时候报了个 ORA-39726 unsupported add/drop column operation on compressed tables的错误. 错误是不能对压缩表增加或删除字段,奇怪的可以增加,但是不能删除. 即使将表MOVE为非压缩表也还是不可以删除. 最后终于找到了一种方法 那就是先将该字段设置为UNUSED,然后在删除UNUSED字段即可. 例如: ALTER TABLE test SET UNUSED COLUMN RO

SQL Server数据库设计表和字段的经验

检查各种变化 我在设计数据库的时候会考虑到哪些数据字段将来可能会发生变更.比方说,姓氏就是如此(注意是西方人的姓氏,比如女性结婚后从夫姓等).所以,在建立系统存储客户信息时,我倾向于在单独的一个数据表里存储姓氏字段,而且还附加起始日和终止日等字段,这样就可以跟踪这一数据条目的变化. 采用有意义的字段名 有一回我参加开发过一个项目,其中有从其他程序员那里继承的程序,那个程序员喜欢用屏幕上显示数据指示用语命名字段,这也不赖,但不幸的是,她还喜欢用一些奇怪的命名法,其命名采用了匈牙利命名和控制序号的组

MySQL和Oracle的添加字段的处理差别

昨天在微信群中有个朋友也是无意中问了一下,说数据库中的表字段想保持一种相对规范的顺序,怎么办?要知道Oracle中这个操作就比较纠结了,因为是按照追加的方式来处理的.没法在已有的字段1,字段2中间添加一个字段3.但是MySQL却可以,这个方面MySQL看起来要灵活的多,这个是什么原因呢,他们在设计上有什么差别呢. MySQL中对每个表存在一个定义文件,即frm文件,我们来取出一个表,看看能不能简单解析一下. 比如一个表字段的内容如下: > desc zd_warshrine_prostate;