Oracle高水位线

本文详细解释了数据库中的高水位线(HWM)概念及其对数据库操作的影响,并介绍了查看和调整HWM的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(一)什么是高水位线(HWM)

这个HWM是一个标记,用来说明已经有多少没有使用的数据块分配给这个segment。HWM 通常增长的幅度为一次5个数据块,原则上HWM 只会增大,不会缩小,即使将表中的数据全部删除,HWM还是为原值,由于这个特点,使HWM 很象一个水库的历史最高水位,这也就是HWM 的原始含义,当然不能说一个水库没水了,就说该水库的历史最高水位为0。但是如果我们在表上使用了truncate 命令,则该表的HWM 会被重新置为0。

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

(二)HWM对数据库操作的影响

1)全表扫描通常要读出直到HWM 标记的所有的属于该表数据库块,即使该表中没有任何数据。

2)即使HWM 以下有空闲的数据库块,键入在插入数据时使用了append 关键字,则在插入时使用HWM 以上的数据块,此时HWM 会自动增大。(关于insert /*+ append */:a、非归档模式下,只需append就能大量减少redo的产生;归档模式下,只有append+nologging才能大量减少redo。 b、insert /*+ append */时会对表加锁(排它锁),会阻塞表上的除了select以外所有DML语句;c、insert /*+ append */ 直接路径加载,速度比常规加载方式快。因为是从HWM的位置开始插入,也许会造成空间浪费。)

(三)查看一个表的HWM

ANALYZE TABLE <tablename> ESTIMATE/COMPUTE STATISTICS;

SELECT blocks, empty_blocks, num_rows FROM user_tables WHERE table_name = <tablename>;

BLOCKS 列代表该表中曾经使用过得数据库块的数目,即水线。EMPTY_BLOCKS 代表分配给该表,但是在水线以上的数据库块,即从来没有使用的数据块。

(四)低HWM的概念

手动段空间管理中,段中只有一个HWM,但是在自动段空间管理中又有多了一个低HWM 的概念出来。这个是因为自动段空间管理的特性造成的。在手段段空间管理中,当数据插入以后,如果是插入到新的数据块中,数据块就会被自动格式化等待数据访问。而在自动段空间管理中,数据插入到新的数据块以后,数据块并没有被格式化,而是在第一次在第一次访问这个数据块的时候才格式化这个块。所以我们又需要一条水位线,用来标示已经被格式化的块。这条水位线就叫做低HWM。一般来说,低HWM 肯定是低于等于HWM 的。

(五)降低HWM

1)采用TRUNCATE 语句删除一个表的数据的时候,类似于重新建立了表,不仅把数据都删除了,还把HWM 给清空恢复为0。

2)执行表重建指令alter table table_name move;(MOVE 后面不跟参数也行,不跟参数表还是在原来的表空间,move 后记住重建索引。如果以后还要继续向这个表增加数据,没有必要move,只是释放出来的空间,只能这个表用,其他的表或者segment 无法使用该空间)

3)shrink

a. alter table 表名 enable row movement;  --打开行移动

b.

alter table 表名 shrink space cascade; --压缩表及相关数据段并下调HWM
alter table 表名 shrink space compact; --只压缩不下调HWM
alter table 表名 shrink space ; --下调HWM
c. alter table 表名 disable row movement; --关闭行移动
4)复制要保留的数据到临时表t,drop 原表,然后rename 临时表t 为原表。
5)把表导出后truncate,然后再把表导入,不过这种方法会使得业务暂时不可用。













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值