当前位置: 首页 > 最新文章 > 正文

oracle实验:通过shrink来收缩HWM+shrink实现机制

概述前面已经介绍了怎么通过move去降低HWM及通过存储过程来看move对于HWM是否有明显的效果,下面介绍下通过shrink来降低HWM的实验和shrink的实现机制。篇幅有限,这里对shrink的实现机制就不做实验了,大家感兴趣的朋友可以测试下,过程跟前面move步骤差不多,通过看table 的 rowid、block的 id 和信息和数据分布在哪个块就可以知道结果了。概述前面已经介绍了怎么通

admin

概述前面已经介绍了怎么通过move去降低HWM及通过存储过程来看move对于HWM是否有明显的效果,下面介绍下通过shrink来降低HWM的实验和shrink的实现机制。篇幅有限,这里对shrink的实现机制就不做实验了,大家感兴趣的朋友可以测试下,过程跟前面move步骤差不多,通过看table 的 rowid、block的 id 和信息和数据分布在哪个块就可以知道结果了。

概述

前面已经介绍了怎么通过move去降低HWM及通过存储过程来看move对于HWM是否有明显的效果,下面介绍下通过shrink来降低HWM的实验和shrink的实现机制。


1、基础环境搭建

create tablespace assm datafile '/oracle/oradata/NWPPDB/datafile/assm01.dbf' size 30M extent management local uniform size 256K segment space management auto;

conn nwpp/nwpp;

select * from v$version;

select TABLESPACE_NAME,BLOCK_SIZE,EXTENT_MANAGEMENT, ALLOCATION_TYPE, SEGMENT_SPACE_MANAGEMENT from dba_tablespaces where TABLESPACE_NAME = 'ASSM';

create table my_objects tablespace assm as select * from all_objects;

oracle实验:通过shrink来收缩HWM+shrink实现机制

2、随机地从table MY_OBJECTS中删除一部分数据:

select count(*) from my_objects;

delete from my_objects where object_name like '%C%';

delete from my_objects where object_name like '%U%';

delete from my_objects where object_name like '%A%';

oracle实验:通过shrink来收缩HWM+shrink实现机制

3、使用 show _space 和 show _space_assm 来看看 my_objects的数据存储状况:

exec show_space('MY_OBJECTS','NWPP');

exec show_space_assm('MY_OBJECTS','NWPP');

oracle实验:通过shrink来收缩HWM+shrink实现机制

这里我们可以看到表my_objects的HWM下有1236个block,其中,free space为 25-50% 的 block 有422个,free space 为 50-75% 的block有330个,free space 为 75-100% 的 block 有387个,Full的 block只有71个,这种情况下,需要对这个表的现有数据行进行重组。

4、通过shrink来降低HWM

要使用 ASSM 上的 shrink,首先需要使该表支持行移动,然后降低my_objects的 HWM 并回收空间

alter table my_objects enable row movement;

alter table my_objects shrink space;

oracle实验:通过shrink来收缩HWM+shrink实现机制

5、使用 show _space 和 show _space_assm 来看看 my_objects的数据存储状况:

exec show_space('MY_OBJECTS','NWPP');

exec show_space_assm('MY_OBJECTS','NWPP');

oracle实验:通过shrink来收缩HWM+shrink实现机制

在执行完shrink命令后,可以看到表my_objects的HWM 现在降到了542(544-3+1)的位置,而且HWM下block 的空间使用状况为:Full的block有523个,free space为25-50%的block只有3个。


shrink实现机制

shrink是10g中引入的新特性,可以在线对表进行类似重组的操作,降低高水位,且对业务基本没有影响,shrink的分2个阶段进行

(1)Segment data is compacted. Through a series of INSERT and DELETE statements (during which DML-compatible locks are held on individual rows or blocks of the table), the segment data is moved as far to the beginning of the segment as possible. Given that rowids change, you must enable row movement and also disable any triggers based on rowid for table segments you want to shrink.

这个过程实际上是在segment内部进行一系列的insert和delete,把segment中后面的数据尽可能的移动到segment前面,使数据更加紧凑。

(2)High-water mark (HWM) is adjusted to an appropriate location (exclusive locks are held on the data at this point), and unused space is deallocated from the segment, so it is available for the tablespace to reallocate to other objects as needed.

这个过程是将segment的高水位降低,释放存储空间。


篇幅有限,这里对shrink的实现机制就不做实验了,大家感兴趣的朋友可以测试下,过程跟前面move步骤差不多,通过看table 的 rowid、block的 id 和信息和数据分布在哪个块就可以知道结果了。

后面会分享更多DBA方面内容,感兴趣的朋友可以关注下!!

oracle实验:通过shrink来收缩HWM+shrink实现机制


上一篇: 发送这份邮件英语(或者给我发邮件英语) 下一篇:警惕“匿名社交”的潜在风险
返回顶部