alter table列管理的一些区别

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$

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10248702/viewspace-675568/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10248702/viewspace-675568/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值