「oracle 實驗」用Shrink Space收縮Oracle數據段|原理解析

一、表的增長方式

當表被創建後,隨著記錄的不斷插入,組成表的區間會被填滿,如果啟用了自動擴展,則當區間填滿後,會分配新的區間。假定高水

位線隨著記錄的增加從最左端往右端來移動,當到底部區間的尾端時,則新的區間將會被分配。


二、表可收縮的原理

隨著記錄的增加高水位線不斷的右移,記錄的刪除不會導致高水位線往回(左)移動

刪除記錄後的空閒空間(高水位線左側)儘管可以使用,但其稀疏性導致空間空閒

在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
「oracle 實驗」用Shrink Space收縮Oracle數據段|原理解析

--直接收縮,提示必須啟動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
「oracle 實驗」用Shrink Space收縮Oracle數據段|原理解析

--收縮成功,空間已經釋放

SQL> alter table t_auto shrink space;
Table altered

SQL> select blocks from dba_segments where segment_name='T_AUTO';
BLOCKS
----------
8
「oracle 實驗」用Shrink Space收縮Oracle數據段|原理解析

--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
「oracle 實驗」用Shrink Space收縮Oracle數據段|原理解析


今天抽空測試的一個實驗,還可以,總結如下:

Shrink Space實質上構造一個新表(在內部表現為一系列的DML操作,即將副本插入新位置,刪除原來位置的記錄) ,靠近末尾處(右端)數據塊中的記錄往開始處(左端)的空閒空間處移動(DML操作),不會引起DML觸發器。當所有可能的移動被完成,高水位線將會往左端移動(DDL操作),新的高水位線右邊的空閒空間被釋放(DDL操作)

覺得有用的幫忙轉發哦~

後面會分享更多關於運維DBA內容,感興趣的朋友可以關注下,也會介紹多一些實驗給大家測試。

「oracle 實驗」用Shrink Space收縮Oracle數據段|原理解析


分享到:


相關文章: