「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数据段|原理解析


分享到:


相關文章: