如果經常在表上執行DML操作,會造成數據庫塊中數據分佈稀疏,浪費大量空間。同時也會影響全表掃描的性能,因爲全表掃描需要訪問更多的數據塊。從oracle10g開始,表可以通過shrink來重組數據使數據分佈更緊密,同時降低HWM釋放空閒數據塊。
從10g開始,oracle開始提供Shrink的命令,假如我們的表空間中支持自動段空間管理 (ASSM),就可以使用這個特性縮小段,即降低HWM。這裏需要強調一點,10g的這個新特性,僅對ASSM表空間有效,否則會報 ORA-10635: Invalid segment or tablespace type。
比如我工作中使用的系統有個LOG表,記錄的日誌經常會刪除。時間長了查詢速度變慢,而且浪費表空間。下面就以這個表爲例,記錄下收縮表空間的方法。
1. 查看收縮前表的使用情況
select sum(bytes)/1024/1024 Mb from user_segments where segment_name='LOG';
2. 開啓行遷移
alter table LOG enable row movement;
3. 整理表空間內的碎片
alter table LOG shrink space compact;
4. 收縮表空間
alter table LOG shrink space;
5.再查看收縮後的表空間使用情況
select sum(bytes)/1024/1024 Mb from user_segments where segment_name='LOG';
注意:收縮表空間要在數據庫比較空閒的時候做。