alter table列管理的一些區別

gdutllf2006發表於2010-10-08
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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章