oracle 大表添加字段方法
近期,考虑到生产一线大表需要进行表结构更改,自身测试了一把,如下:
操作系统版本:centos 6.5
数据库版本:oracle 11.2.0.4
数据表:中小型堆表,千万级
- 先分享一个创建测试表、序列、数据的小脚本
创建测试表
create table insert_test(
id number,
address varchar2(20),
QRcode varchar2(20),
password varchar2(30)
);
创建一个自用序列
create sequence wyl_seq
start with 1
increment by 1
nomaxvalue
nominvalue
nocycle
nocache;
插入12000000行数据,47分钟。。。。。
begin
for i in 1 .. 12000000 loop
insert into insert_test values(WYL_SEQ.NEXTVAL,'www.baidu.com',dbms_random.string('x', 20),dbms_random.string('p',30));
end loop;
commit;
end;
/
- 现在进行加字段并设置默认值测试,主要有两种方法(一是直接添加并设置默认值,二是先添加,然后modify默认值)
我们先测试一下第二种方法
alter table insert_test add str_te varchar2(10);
alter table insert_test modify str_te default '0';
发现很快就完成了,时间可以忽略不计,下面测试一下第一种方法
alter table insert_test add str_te varchar2(10) default '0';
竟然达到了21分钟。。。。
结论:alter table add
语句加上defalut时会刷新存量数据并产生表级锁,需慎用。特别是大表,生产环境,业务产生期间就应该禁止此操作。 改为add table
add不带缺省值,接着来个alter table aa modify column_1 varchar2(2) default
‘Y’;更新存量数据可放到业务较少的凌晨跑。