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$
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- alter table move 和 alter table shrink space的區別
- ALTER TABLE MOVE | SHRINK SPACE區別
- alter table move 與shrink space的區別
- alter table move跟shrink space的區別
- ALTER TABLE MOVE和SHRINK SPACE區別
- alter table move跟shrink space的區別(轉)
- v$lock之alter table drop column與alter table set unused column區別系列五
- alter database和alter system和alter session的區別DatabaseSession
- alter system events與alter system event的區別
- ALTER DATABASE 與 ALTER TABLESPACE OFFLINE的區別Database
- Alter table for ORACLEOracle
- mysql的ALTER TABLE命令MySql
- 忍不住問下alter system 和alter database的區別Database
- drop table和truncate table的區別
- alter system switch logfile和alter system archive log current的區別Hive
- alter system switch logfile 和 alter system archive log current 的區別Hive
- ALTER SYSTEM SWITCH LOGFILE ALTER SYSTEM ARCHIVELOG CURRENT 區別Hive
- oracle alter table詳解Oracle
- alter table using indexIndex
- [轉]alter system switch logfile和alter system archive log current的區別Hive
- zt:alter system switch logfile與ALTER SYSTEM ARCHIVE LOG CURRENT的區別Hive
- table move 與 shrink 的區別
- alter system set event和set events的區別
- ALTER SYSTEM 中 SCOPE=SPFILE/MEMORY/BOTH 的區別:
- alter database datafile offline drop 與 alter tablespace drop datafile 區別Database
- alter database drop datafile 與 drop tablespace file 的區別Database
- alter index rebuild和rebuild online的區別IndexRebuild
- MySQL的create table as 與 like區別MySql
- Oracle --- PLAN_TABLE$和PLAN_TABLE區別Oracle
- alter table語法增補(一)
- 【轉】dbms_stats.gather_table_stats與analyze table 的區別
- oracle 中 ALTER TABLE ADD default 的明確Oracle
- 內表(internal table)和工作區(work area)的區別
- dbms_stats.gather_table_stats與analyze table 的區別[轉貼]
- datafile offline 與alter tablespace offline 的區別
- in和exists的一些區別
- alter table table_name move ; 在自身表空間move是如何操作的?
- alter table engine=memory ERROR 1114Error