ORACLE高水位线(HWM)和shrink table(表空间收缩)

本文详细介绍了ORACLE数据库中的高水位线(HWM)概念,阐述了HWM在数据存储、全表扫描中的作用,以及在插入和删除数据时HWM如何变化。此外,还讲解了从10g开始引入的SHRINK TABLE功能,用于在自动段空间管理(ASSM)表空间中收缩段,降低HWM以释放空闲数据块。SHRINK TABLE分为数据重组和HWM调整两个阶段,并提供了不同选项以适应不同业务场景。最后,提供了SQL脚本示例,帮助执行表和索引的收缩操作。
摘要由CSDN通过智能技术生成

一、ORACLE高水位线(HWM)

       1.1 ORACLE用HWM来界定一个段中使用的块和未使用的块。

       当我们创建一个表时, ORACLE就会为这个对象分配一个段, 在这个段中即使我们未插入任何记录, 也至少有一个区被分配, 第一个区的第一个块就称为段头块(SEGMENT_HEADER), 段头中就储存了一些信息, 其中HWM的信息就存储在此。此时, 因为第一个区的第一块用于存储段头的一些信息, 虽然没有存储任何实际的记录, 但也算是被使用, 此时HWM是位于第2个块, 当我们不断插入数据后, 第一个块已经放不下后面新插入的数据, 此时, ORACLE将高水位之上的块用于存储新增数据, 同时, HWM本身也向上移, 也就是说, 当我们不断插入数据时, HWM会不断上移, 这样, 在HWM之下的, 就表示使用过的块。 HWM之上的就表示已分配但从未使用过的块。

        1.2 HWM在插入数据时, 当现有空间不足而进行空间的扩展时会向上移, 但删除数据时不会往下移。

        1.3 HWM本身的信息是存储在段头, 在段空间是手工管理方式时, ORACLE是通过FREELIST(一个单向链表)来管理段内的空间分配, 在段空间是自动管理方式时, ORACLE是通过BITMAP来管理段内的空间分配。

        1.4 ORACLE的全表扫描是读取高水位标记(HWM)以下的所有块。

        所以问题就产生了, 当用户发出一个全表扫描时, ORACLE始终必须从段一直扫描到HWM, 即使它什么也没有发现。 该任务延长了全表扫描的时间

二、SHRINK(收缩) TABLE(表空间收缩)

       从10g开始, ORACLE开始提供SHRINK的命令, 假如我们的表空间中支持自动段空间管理(ASSM), 就可以使用这个特性缩小段, 即降低HWM。 10g的这个新特性, 仅对ASSM表空间有效, 否则会报ORA-10635: Invalid segment or tablespace t

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值