1 对大表添加列:
Alter table xxx add col_xxx varchar2(20) default;
拆成:
Alter table xxx add col_xxx varchar2(20);
Alter table xxx modify col_xxx default 'xx';
速度上应该有大的提升.
对大表添加列:
Alter table xxx add col_xxx varchar2(20) default;
会加锁DDL锁,导致其它DML语句无法执行,所以在业务时间不可能操作.
SQL> select object_id, session_id, oracle_username, os_user_name, process,
2 decode(LOCKED_MODE,0,'None',1,'NULL',2,'RS',3,'RX',4,'S',5,'RSX',6,'X') LOCKED_MODE
3 from v$locked_object;
OBJECT_ID SESSION_ID ORACLE_USERNAME OS_USER_NAME PROCESS LOCKED_MODE
---------- ---------- ------------------------------ ------------------------------ ------------ -----------
46400 17 GZDC oracle 22730 X
加的是排它锁.
示例:两种方式的区别:
Alter table xxx add col_xxx varchar2(20) default; 会对已存在表中的记录更新列的值.
Alter table xxx add col_xxx varchar2(20);
Alter table xxx modify col_xxx default 'xxx';
不会更新之前的值,只对以后插入的记录生效.
所以对于大表,要根据需求,慎重选用哪种方式.
SQL> conn gzdc/gzdc2009
Connected.
SQL> create table t3(name varchar2(20),id number);
SQL> insert into t3(name,id) values('gdut',1);
SQL> commit;
SQL> select * from t3;
NAME ID
-------------------- ----------
gdut 1
SQL> alter table t3 add sex varchar2(20) default 'M';
Table altered.
SQL> select * from t3;
NAME ID SEX
-------------------- ---------- --------------------
gdut 1 M
SQL> alter table t3 add age number(4);
Table altered.
SQL> alter table t3 modify age default 10;
Table altered.
SQL> select * from t3;
NAME ID SEX AGE
-------------------- ---------- -------------------- ----------
gdut 1 M
SQL> insert into t3(name,id) values('mouse',2);
1 row created.
SQL> select * from t3;
NAME ID SEX AGE
-------------------- ---------- -------------------- ----------
gdut 1 M
mouse 2 M 10
2 对大表删除列:
使用alter table t3 set unused (sex); 来代替Alter table t3 drop column sex;
如可以利用命令ALTER TABLE ADRESS SET UNUSED,把某个列设置为不活跃。
如此设置之后,从用户的角度来看,被设置为UNUSED状态的列于被直接删除的列之间是没有任何区别的。用户无法通过查询或者在数据字典中看到这些列。
而且即使在表中,也可以插入相同列名的列。简单的说,对于用户来说,这个设置为UNUSED的列就好像删除了一样。但是从数据角度来说,在是不一样的。
其这个列只是别设置为UNUNSED列,但是在数据库中仍然是存在的。也就是说,这个列所占用的存储空间没有被释放。
为此即使在数据库运行的高峰时期,为列加入这个标记也不会占用多少的时间和系统资源
Set unused 将一个列的名字转换,还将这个列的显示顺序的值设为0;
ALTER table t3 set unused(age);
select object_id, object_name from user_objects where object_name='T3';
OBJECT_ID
----------
46401
SQL> SELECT COL#,NAME FROM SYS.COL$ WHERE OBJ#=46401;
COL# NAME
---------- ------------------------------
1 NAME
2 ID
3 SEX
0 SYS_C00004_10100819:58:14$
Alter table xxx add col_xxx varchar2(20) default;
拆成:
Alter table xxx add col_xxx varchar2(20);
Alter table xxx modify col_xxx default 'xx';
速度上应该有大的提升.
对大表添加列:
Alter table xxx add col_xxx varchar2(20) default;
会加锁DDL锁,导致其它DML语句无法执行,所以在业务时间不可能操作.
SQL> select object_id, session_id, oracle_username, os_user_name, process,
2 decode(LOCKED_MODE,0,'None',1,'NULL',2,'RS',3,'RX',4,'S',5,'RSX',6,'X') LOCKED_MODE
3 from v$locked_object;
OBJECT_ID SESSION_ID ORACLE_USERNAME OS_USER_NAME PROCESS LOCKED_MODE
---------- ---------- ------------------------------ ------------------------------ ------------ -----------
46400 17 GZDC oracle 22730 X
加的是排它锁.
示例:两种方式的区别:
Alter table xxx add col_xxx varchar2(20) default; 会对已存在表中的记录更新列的值.
Alter table xxx add col_xxx varchar2(20);
Alter table xxx modify col_xxx default 'xxx';
不会更新之前的值,只对以后插入的记录生效.
所以对于大表,要根据需求,慎重选用哪种方式.
SQL> conn gzdc/gzdc2009
Connected.
SQL> create table t3(name varchar2(20),id number);
SQL> insert into t3(name,id) values('gdut',1);
SQL> commit;
SQL> select * from t3;
NAME ID
-------------------- ----------
gdut 1
SQL> alter table t3 add sex varchar2(20) default 'M';
Table altered.
SQL> select * from t3;
NAME ID SEX
-------------------- ---------- --------------------
gdut 1 M
SQL> alter table t3 add age number(4);
Table altered.
SQL> alter table t3 modify age default 10;
Table altered.
SQL> select * from t3;
NAME ID SEX AGE
-------------------- ---------- -------------------- ----------
gdut 1 M
SQL> insert into t3(name,id) values('mouse',2);
1 row created.
SQL> select * from t3;
NAME ID SEX AGE
-------------------- ---------- -------------------- ----------
gdut 1 M
mouse 2 M 10
2 对大表删除列:
使用alter table t3 set unused (sex); 来代替Alter table t3 drop column sex;
如可以利用命令ALTER TABLE ADRESS SET UNUSED,把某个列设置为不活跃。
如此设置之后,从用户的角度来看,被设置为UNUSED状态的列于被直接删除的列之间是没有任何区别的。用户无法通过查询或者在数据字典中看到这些列。
而且即使在表中,也可以插入相同列名的列。简单的说,对于用户来说,这个设置为UNUSED的列就好像删除了一样。但是从数据角度来说,在是不一样的。
其这个列只是别设置为UNUNSED列,但是在数据库中仍然是存在的。也就是说,这个列所占用的存储空间没有被释放。
为此即使在数据库运行的高峰时期,为列加入这个标记也不会占用多少的时间和系统资源
Set unused 将一个列的名字转换,还将这个列的显示顺序的值设为0;
ALTER table t3 set unused(age);
select object_id, object_name from user_objects where object_name='T3';
OBJECT_ID
----------
46401
SQL> SELECT COL#,NAME FROM SYS.COL$ WHERE OBJ#=46401;
COL# NAME
---------- ------------------------------
1 NAME
2 ID
3 SEX
0 SYS_C00004_10100819:58:14$
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10248702/viewspace-675568/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/10248702/viewspace-675568/