Oracle set unused的用法.sql
--http://space.itpub.net/8111049/viewspace-666550
原理:清楚掉字典資訊(撤消儲存空間),不可恢復。
可以使用 SET UNUSED 選項標記一列或者多列不可用。
使用DROP SET UNUSED 選項刪除被被標記為不可用的列。
語法:
ALTER TABLE table SET UNUSED (COLlist多個) 或者 ALTER TABLE table SET UNUSED COLUMN col單個;
ALTER TABLE table DROP UNUSED COLUMNS;
set unused不會真地刪除欄位。
除了alter table drop field外,也可以
alter table set unused field;
alter table drop unused;
set unused系統開銷比較小,速度較快,所以可以先set unuased,然後在系統負載較小時,再drop。如系統負載不大,也可以直接drop。
不管用何種方法,都不會收回空間。
如果你有這個需求,要刪除某一個表格上的某些欄位,但是由於這個表格擁有非常大量的資料,如果你在尖峰時間直接執行 ALTER TABLE ABC DROP (COLUMN);可能會收到 ORA-01562 - failed to extend rollback segment number string,
這是因為在這個刪除欄位的過程中你可能會消耗光整個RBS,造成這樣的錯誤出現,因此這樣的做法並不是一個好方法,就算你拼命的加大RBS空間來應付這個問題,也不會是個好主意。
/
SQL> ALTER TABLE T1 SET UNUSED COLUMN A CASCADE CONSTRAINTS;
不要馬上drop column,應該先set unused讓column無法使用,避開系統尖峰時間再來處理刪除欄位裡的資料,要注意的是一但你set unused column,這個欄位是無法再回復使用的。
3>
重點來了,若你的欄位有一百萬筆資料,我們應該避免一次寫入那麼多的undo log,所以我準備每刪除一千筆資料就commit一次。
SQL> alter table t1 drop unused columns checkpoint 1000;
Table altered.
在離峰的時間進行這樣的動作,應該可以避免 ORA-01562 的錯誤發生。
-----------------------------------------------------------------------------------------------
如何修復被設定為UNUSED的欄位,可以恢復(以下步驟執行前要做好備份),沒有經驗的DBA不要輕易嘗試。(最好別做)
CREATE TABLE T1(A NUMBER,B NUMBER)
/
begin
for i in 1 .. 100000
loop
insert into t1 values (i,100);
end loop;
commit;
end;
begin
for i in 1 .. 100000
loop
insert into t1 values (i,100);
end loop;
commit;
end;
/
select count(*) from t1;
/
ALTER TABLE T1 SET UNUSED COLUMN A CASCADE CONSTRAINTS
/
alter table t1 drop unused columns checkpoint 1000
/
select * from t1
/
CREATE TABLE TTTA ( A INTEGER,B INTEGER,C VARCHAR2(10),D INTEGER);
/
INSERT INTO TTTA VALUES (1,2,'3',4);
select count(*) from t1;
/
ALTER TABLE T1 SET UNUSED COLUMN A CASCADE CONSTRAINTS
/
alter table t1 drop unused columns checkpoint 1000
/
select * from t1
/
CREATE TABLE TTTA ( A INTEGER,B INTEGER,C VARCHAR2(10),D INTEGER);
/
INSERT INTO TTTA VALUES (1,2,'3',4);
INSERT INTO TTTA VALUES (2,3,'4',5);
/
ALTER TABLE TTTA SET UNUSED COLUMN C;
/
--sys使用者
SELECT OBJ# FROM OBJ$ WHERE NAME='TTTA';
/
ALTER TABLE TTTA SET UNUSED COLUMN C;
/
--sys使用者
SELECT OBJ# FROM OBJ$ WHERE NAME='TTTA';
75533
SELECT COL#,INTCOL#,NAME FROM COL$ WHERE OBJ#=75533;
COL# INTCOL# NAME
1 1 A
2 2 B
3 3 C
4 4 D
1 1 A
2 2 B
3 3 C
4 4 D
SELECT COLS FROM TAB$ WHERE OBJ#=75533;
4
UPDATE COL$ SET COL#=INTCOL# WHERE OBJ#=75533;
UPDATE TAB$ SET COLS=COLS+1 WHERE OBJ#=75533;
UPDATE COL$ SET NAME='C' WHERE OBJ#=75533 AND COL#=4;
UPDATE COL$ SET PROPERTY=0 WHERE OBJ#=75533;
--重啟資料庫
SELECT * FROM TTTA;
SELECT * FROM TTTA;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25323853/viewspace-707392/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle set unused的用法Oracle
- 表的列被set unused的機制
- set unused 是否會釋放儲存空間
- ORACLE SQL的EXCEPT、INTERSECT用法OracleSQL
- Oracle sql trace用法OracleSQL
- oracle ocp 19c考題,科目082考試題(19)-set unused columnOracle
- oracle ocp 19c考題,科目082考試題(20)-set unused columnOracle
- 【優化】ORACLE set autotrace in SQL*Plus優化OracleSQL
- Python中set的用法Python
- shell中set指令的用法
- oracle11g alter table set unused column指定表某列不可用之系列一Oracle
- Oracle PL/SQL中EXCEPTION用法OracleSQLException
- Oracle SQL 跟蹤 --- dbms_system.set_sql_trace_in_sessionOracleSQLSession
- 【SQL/PLUS】Oracle PL/SQL程式設計用set serveroutput onSQLOracle程式設計Server
- MyBatis系列(七):MyBatis動態Sql之choose,where,set標籤的用法MyBatisSQL
- nginx upload 模組build錯誤解決error: variable ‘result’ set but not used [-Werror=unused-but-set-variable]NginxUIError
- set unused column和檢視,約束,同義詞和索引的關係索引
- STL:set用法總結
- 【C++ STL】Set用法C++
- rman set newname switch 用法
- SQL AS 的用法SQL
- C++ set的一些用法C++
- Oracle裡的setOracle
- STL中set用法詳解
- 【SQL】Oracle查詢轉換之 OR用法SQLOracle
- 【實戰】使用“基表修改法”恢復被“set unused”方式誤刪除的列
- set autotrace的用法和含意及區別
- SQL 中With as 的用法SQL
- sql tuning setSQL
- set autotrace in SQL*PlusSQL
- 【實戰】使用“基表修改法”恢復被“set unused”方式誤刪除的列(續)
- MyBatis從入門到精通(七):MyBatis動態Sql之choose,where,set標籤的用法MyBatisSQL
- v$lock之alter table drop column與alter table set unused column區別系列五
- SQL語句IN的用法SQL
- sql語句中as的用法SQL
- SQL 語句 as 的用法SQL
- 很全的sql用法SQL
- oracle set eventsOracle