Oracle HWM( High Water Mark)

1、什么是HWM

注意:此部分内容请先了解oracle物理结构和逻辑结构

顾名思义,这是一条水位线,oracle的每一个对象都是一个segement,用表来举例,那么这个表你就可以想象成蓄水池,这个HWM就是这条水位线,类比到segement上,水位线以下是存放的数据,水上面就是没有蓄水的水池部分。与传统水池有些许不同,segement的HWM不会下降并且它的高度会自动增加,比如你删除了数据,那么这个HWM是不会下降的,如果你的表存不下数据了,那么他会自动分配新的block到这个segement当中。

segement是一串连续的extend扩展区构成,一个extend扩展区由很多block块构成,一个block由很多rows构成,这个rows就是我们的一条一条的记录。

Above the HWM:these blocks are unformatted and have never been used.

Below the HWM :

  • Allocated, but currently unformatted and unused
  • Formatted and contain data
  • Formatted and empty because the data was deleted

刚开始创建表的时候
Oracle HWM( High Water Mark)
插入数据的时候
Oracle HWM( High Water Mark)
删除了数据再插入数据的时候
Oracle HWM( High Water Mark)
空间不足的时候
Oracle HWM( High Water Mark)
为什么图中会出现Low HWM呢?是因为我们在ASSM(自动段空间管理)当中,数据插入到新的数据块当中的时候,数据块并没有格式化,而是在第一次访问这个数据块的时候才格式化这个快,这个LowHWH就是来标识已经格式化的块。

更加详细介绍见官网,再写在这里也是啰嗦

https://docs.oracle.com/cd/E11882_01/server.112/e40540/logical.htm#CNCPT402

2、如何理解HWM

当我们在进行查询的时候,会扫描我们的存储数据的block,oracle扫描的是HWM以下的数据块。我们使用一个数据表的时候,会发现一个问题,就是在刚开始使用这个表感觉做一些查询什么的都非常快,当使用时间长了的时候,就会发现这个表无论是查询还是什么操作,都会变得很慢,其实这个时候就关乎这个HWM的事情了。

当我们对整个表进行了多次的crud的时候,那么我们的HWM会变得很高,并且这个HWM是不会自己降低的,而且这个时候,在segement里面的存储空间,因为进行了多次增加删除的操作,会存在很多的碎片空间,这时候我们再次插入一条记录,oracle顺序扫描整个存储空间,找到能放下整个记录的碎片空间,然后把这个记录塞进去,这个时候降低了插入的效率,所以你会感觉操作会变得很慢。

同样的,举一个例子,当我们往一个新表中插入一千万的数据记录,然后使用delete操作删除这些记录,那么我们再次执行查询操作,你同样会发现这个select执行的很慢,虽然表中是没有什么记录的,这个时候其实HWM就变成了一个关键。

同样,再举一个例子,我们往一张表中插入大批量的数据,前面的内容我们已经知道,oracle插入记录会扫描表空间的存储碎片,当然小批量的数据可能不存在性能问题,但是,如果我们使用存储过程,插入大批量数据的时候,性能问题其实是值得关注的。那么我们可不可以不扫描碎片空间直接在LOW HWM高水位线后面插入数据呢?答案是可以的,我们这个时候通过加入Append操作,让插入操作直接在高水位线后插入数据。

3、修正Oracle表的HWM

3.1、重建表

复制要保留的数据到临时表,drop掉原表,然后将临时表重命名为原表名

3.2、释放空闲block
ALTER TABLE table_name Deallocate unused
3.3、移动表空间
ALTER TABLE table_name MOVE TABLESPACE tablespace_name

如果不加表空间,则默认为本空间

3.4 shrink (推荐)

segement shrink分为两个阶段

1、数据重组:insert、delete等操作,尽量将数据排在前面,在这个过程表会加上RX锁,只会在需要移动的行上加锁。由于涉及到rowid的修改,需要enable row movement。

2、HWM调整,释放空闲数据块。此过程需要在表加上X锁,会造成表的dml语句阻塞。

alter table_name shrink space [<null> | compact| cascade];

alter table table_name shrink space compact; -- 收缩表
alter table table_name shrink space; --收缩表 降低HWM

alter table table_name shrink space cascade; --收缩表,降低HWM ,并且把相关索引收缩

alter index idx_name shrink space;--回缩索引

相关文章: