Oracle 10g Shrink Table - Shrink Space 收縮空間
Oracle 10g Shrink Table的使用是本文我們主要要介紹的內容,我們知道,如果經常在表上執行DML操作,會造成資料庫塊中資料分佈稀疏,浪費大量空間。同時也會影響全表掃描的效能,因為全表掃描需要訪問更多的資料塊。從Oracle 10g開始,表可以透過shrink來重組資料使資料分佈更緊密,同時降低HWM釋放空閒資料塊。
segment shrink分為兩個階段:
1、資料重組(compact):透過一系列insert、delete操作,將資料儘量排列在段的前面。在這個過程中需要在表上加RX鎖,即只在需要移動的行上加鎖。由於涉及到rowid的改變,需要enable row movement.同時要disable基於rowid的trigger.這一過程對業務影響比較小。
2、HWM調整:第二階段是調整HWM位置,釋放空閒資料塊。此過程需要在表上加X鎖,會造成表上的所有DML語句阻塞。在業務特別繁忙的系統上可能造成比較大的影響。Shrink Space語句兩個階段都執行。Shrink Space compact只執行第一個階段。
如果系統業務比較繁忙,可以先執行Shrink Space compact重組資料,然後在業務不忙的時候再執行Shrink Space降低HWM釋放空閒資料塊。shrink必須開啟行遷移功能。
alter table table_name enable row movement ;
注意:alter table XXX enable row movement語句會造成引用表XXX的物件(如儲存過程、包、檢視等)變為無效。執行完成後,最好執行一下utlrp.sql來編譯無效的物件。
語法:
- alter table <table_name> shrink space [ <null> | compact | cascade ];
- alter table <table_name> shrink space compcat;
收縮表,相當於把塊中資料打結實了,但會保持high water mark;
alter table
收縮表,降低 high water mark;
alter table
收縮表,降低 high water mark,並且相關索引也要收縮一下下。
alter index idxname Shrink Space;
回縮索引
1:普通表
Sql指令碼,改指令碼會生成相應的語句
- select'alter table '||table_name||' enable row movement;'||chr(10)||'alter table '||table_name||' shrink space;'||chr(10)from user_tables;
- select'alter index '||index_name||' shrink space;'||chr(10)from user_indexes;
2:分割槽表的處理
進行Shrink Space時 發生ORA-10631錯誤.Shrink Space有一些限制.
在表上建有函式索引(包括全文索引)會失敗。
Sql指令碼,改指令碼會生成相應的語句
- select 'alter table '||table_name||' enable row movement;'||chr(10)||'alter table '||table_name||' shrink space;'||chr(10) from user_tables where ;
- select 'alter index '||index_name||' shrink space;'||chr(10) from user_indexes where uniqueness='NONUNIQUE' ;
- select 'alter table '||segment_name||' modify subpartition '||partition_name||' shrink space;'||chr(10) from user_segments where segment_type='TABLE SUBPARTITION' ';
Shrink的幾點問題:
1. shrink後index是否需要rebuild:因為shrink的操作也會改變行資料的rowid,那麼,如果table上有index時,shrink table後index會不會變為UNUSABLE呢?
我們來看這樣的實驗,同樣構建my_objects的測試表:
- create table my_objects tablespace ASSM as select * from all_objects where rownum<20000;
- create index i_my_objects on my_objects (object_id);
- delete from my_objects where object_name like '%C%';
- delete from my_objects where object_name like '%U%';
現在我們來shrink table my_objects:
- SQL> alter table my_objects enable row movement;
- Table altered
- SQL> alter table my_objects shrink space;
- Table altered
- SQL> select index_name,status from user_indexes where index_name='I_MY_OBJECTS';
- INDEX_NAME STATUS
- ------------------------------ --------
- I_MY_OBJECTS VALID
我們發現,table my_objects上的index的狀態為VALID,估計shrink在移動行資料時,也一起維護了index上相應行的資料rowid的資訊。我們認為,這是對於move操作後需要rebuild index的改進。但是如果一個table上的index數量較多,我們知道,維護index的成本是比較高的,shrink過程中用來維護index的成本也會比較高。
2. shrink時對table的lock
在對table進行shrink時,會對table進行怎樣的鎖定呢?當我們對table MY_OBJECTS進行shrink操作時,查詢v$locked_objects檢視可以發現,table MY_OBJECTS上加了row-X (SX) 的lock:
- SQL>select OBJECT_ID, SESSION_ID,ORACLE_USERNAME,LOCKED_MODE from v$locked_objects;
- OBJECT_ID SESSION_ID ORACLE_USERNAME LOCKED_MODE
- ---------- ---------- ------------------ -----------
- 55422 153 DLINGER 3
- SQL> select object_id from user_objects where object_name = 'MY_OBJECTS';
- OBJECT_ID
- ----------
- 55422
那麼,當table在進行shrink時,我們對table是可以進行DML操作的。
3.shrink對空間的要求
我們在前面討論了shrink的資料的移動機制,既然oracle是從後向前移動行資料,那麼,shrink的操作就不會像move一樣,shrink不需要使用額外的空閒空間
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-709279/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- alter table move與shrink space
- 表空間(資料檔案shrink)收縮示例
- Oracle move和shrink釋放高水位空間Oracle
- 【SHRINK】Oracle收縮表的詳細命令參考Oracle
- [20190918]shrink space與ORA-08102錯誤.txt
- Oracle表空間收縮方案Oracle
- CSS flex-shrinkCSSFlex
- vector::shrink_to_fit()
- 【RESIZE】Oracle收縮表空間主要命令Oracle
- [重慶思莊每日技術分享]-在為表新增了列後執行ALTER TABLE SHRINK SPACE 提示ORA-8102
- Oracle案例11——Oracle表空間資料庫檔案收縮Oracle資料庫
- mysql收縮共享表空間MySql
- Oracle資料庫管理——表資料庫高水位及shrink操作Oracle資料庫
- Oracle 10g大檔案表空間(轉)Oracle 10g
- lvm收縮邏輯卷空間LVM
- oracle表空間不足:ORA-01653: unable to extend tableOracle
- mysql共享表空間擴容,收縮,遷移MySql
- 關於flex-shrink如何計算的冷知識Flex
- 深入理解 flex-grow、flex-shrink、flex-basisFlex
- 沒有磁碟空間 No space left on devicedev
- MySQL 5.7新特性之線上收縮undo表空間MySql
- Oracle 19c 線上縮減 UNDO 表空間 容量Oracle
- Oracle表空間Oracle
- oracle 表空間Oracle
- table/index/LOBINDEX遷移表空間Index
- Space Capital:地理空間情報手冊報告API
- 增加oracle表空間Oracle
- oracle temp 表空間Oracle
- 使用硬連結和coreutils的truncate工具shrink大檔案方法一例
- MySQL InnoDB File-Per-Table表空間MySql
- dbms_space(分析段增長和空間的需求)
- ORA-1653: unable to extend table by 1024 in tablespace(oracle表空間滿了的解決方案)Oracle
- Oracle 擴充磁碟空間Oracle
- oracle表空間的整理Oracle
- Oracle 批量建表空間Oracle
- Oracle清理SYSAUX表空間OracleUX
- oracle 檢視錶空間Oracle
- mac硬碟空間怎麼清理?這樣也能清理出上10G的磁碟空間Mac硬碟
- [20201113]測試CURSOR_SPACE_FOR_TIME(10g).txt