ORACLE-段收缩

风格不统一 提交于 2019-12-13 01:59:39

实验环境

1、oracle 11g
2、 登录用户system

基本概念

收缩段:当一个段被收缩时,段中的数据被压缩,高水线(HWM)下移,并且磁盘空间被释放给包含此段的表空间。段收缩=数据压缩+HWM下移
稀疏填充段:即一个实际使用的空间远小于实际分配给它的空间的段。
行迁移(行移动):收缩表的操作可能会造成表中数据行的ROWID的改变,故在执行一个表的收缩操作之前必须开启这个表的行移动功能。
注:有关高水线的内容可参考另一篇博文。

作用

1、当表空间的空闲空间不足时,可通过收缩段,释放磁盘空间使得表空间的空闲空间增加。
2、当一个对象实际使用的空间比分配给它的空间小得多的时候,可能需要回收那些没有用的磁盘空间。
3、收缩稀疏填充段,有利于全表扫描和DML操作。因为在收缩段后,需要查看的数据块少了。

收缩段的步骤

实验前,查看下测试表ex的情况。

select * from scott.ex;

在这里插入图片描述

select blocks from dba_segments where owner='SCOTT' and segment_name='EX';

在这里插入图片描述

select num_rows,blocks,empty_blocks from dba_tables where owner='SCOTT' and table_name='EX';

在这里插入图片描述

  • 高水线=4608,当前水位线=4513,可上升值=95

1、检查行迁移功能是否开启

select num_rows,blocks,empty_blocks,row_movement from dba_tables where owner='SCOTT' and table_name='EX';

在这里插入图片描述

  • 表ex的行移动功能未开启。

2、开启行移动功能

alter table scott.ex enable row movement;

3、检查行移动功能

select num_rows,blocks,empty_blocks,row_movement from dba_tables where owner='SCOTT' and table_name='EX';

在这里插入图片描述
4、收缩段-数据压缩

alter table scott.ex shrink space compact;

5、查看段的数据块使用情况

analyze table scott.ex compute statistics;
select blocks from dba_segments where owner='SCOTT' and segment_name='EX';

在这里插入图片描述

select num_rows,blocks,empty_blocks,row_movement from dba_tables where owner='SCOTT' and table_name='EX';

在这里插入图片描述

  • 该段的数据块使用情况与原来相同,并无变化。

6、收缩段-HWM下移

alter table scott.ex shrink space;

7、查看段的数据块使用情况

analyze table scott.ex compute statistics;
select blocks from dba_segments where owner='SCOTT' and segment_name='EX';

在这里插入图片描述

select num_rows,blocks,empty_blocks,row_movement from dba_tables where owner='SCOTT' and table_name='EX';

在这里插入图片描述
可以看到, 高水线由原来的4608变为现在的4520,当前水位线无变化,可上升值由95变为7。其中高水线和可上升值下降了相同的数据块个数。由此可见,经过段收缩,ex表的HWM下移了88个数据块,即释放了88个数据块给了ex所在的表空间。
8、关闭行移动功能

alter table scott.ex disable row movement;
select num_rows,blocks,empty_blocks,row_movement from dba_tables where owner='SCOTT' and table_name='EX';

在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!