一、表的增長方式
當表被創建後,隨著記錄的不斷插入,組成表的區間會被填滿,如果啟用了自動擴展,則當區間填滿後,會分配新的區間。假定高水
位線隨著記錄的增加從最左端往右端來移動,當到底部區間的尾端時,則新的區間將會被分配。
二、表可收縮的原理
隨著記錄的增加高水位線不斷的右移,記錄的刪除不會導致高水位線往回(左)移動
刪除記錄後的空閒空間(高水位線左側)儘管可以使用,但其稀疏性導致空間空閒
在oracle中可以使用alter table table_name shrink space收縮表,使用shrink有兩個前提條件:
1、表必須啟用row movement
2、表段所在表空間的段空間管理(segment space management)必須為auto
三、Shrink Space實驗
--建立一個segment space management auto表空間
SQL> create tablespace ts_auto datafile '/home/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/ts_auto.dbf' size 100m extent management local segment space management auto;
Tablespace created
--建議測試表同時指定表空間
SQL> create table t_auto tablespace ts_auto as select * from dba_objects ;
Table created
--查看shrink前的塊數量
SQL> select blocks from dba_segments where segment_name='T_AUTO';
BLOCKS
----------
1280
--delete數據後,空間佔用沒有變化
SQL> delete from t_auto;
83791 rows deleted
SQL> commit;
Commit complete
SQL> select blocks from dba_segments where segment_name='TS_AUTO';
BLOCKS
----------
1280
--直接收縮,提示必須啟動row movement選項
SQL> alter table t_auto shrink space;
alter table t_auto shrink space
ORA-10636: ROW MOVEMENT is not enabled
SQL> alter table t_auto enable row movement;
Table altered
--收縮成功,空間已經釋放
SQL> alter table t_auto shrink space;
Table altered
SQL> select blocks from dba_segments where segment_name='T_AUTO';
BLOCKS
----------
8
--shrink不能在segment space management manaual的表空間的段上執行
SQL> create tablespace ts_manual datafile '/home/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/ts_mannel.dbf' size 100m
2 extent management local segment space management manual;
Tablespace created
SQL> select tablespace_name,segment_space_management from dba_tablespaces;
TABLESPACE_NAME SEGMENT_SPACE_MANAGEMENT
------------------------------ ------------------------
SYSTEM MANUAL
SYSAUX AUTO
UNDOTBS1 MANUAL
TEMP MANUAL
USERS AUTO
GZCSS_GZBH AUTO
OGG AUTO
NWPP AUTO
TS_AUTO AUTO
TS_MANUAL MANUAL
10 rows selected
SQL> create table tb_manual tablespace ts_manual as select * from dba_objects;
Table created
SQL> alter table tb_manual shrink space;
alter table tb_manual shrink space
ORA-10635: Invalid segment or tablespace type
今天抽空測試的一個實驗,還可以,總結如下:
Shrink Space實質上構造一個新表(在內部表現為一系列的DML操作,即將副本插入新位置,刪除原來位置的記錄) ,靠近末尾處(右端)數據塊中的記錄往開始處(左端)的空閒空間處移動(DML操作),不會引起DML觸發器。當所有可能的移動被完成,高水位線將會往左端移動(DDL操作),新的高水位線右邊的空閒空間被釋放(DDL操作)
覺得有用的幫忙轉發哦~
後面會分享更多關於運維DBA內容,感興趣的朋友可以關注下,也會介紹多一些實驗給大家測試。
閱讀更多 波波說運維 的文章