Oracle HWM( High Water Mark)

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)_第1张图片
插入数据的时候
Oracle HWM( High Water Mark)_第2张图片
删除了数据再插入数据的时候
Oracle HWM( High Water Mark)_第3张图片
空间不足的时候
Oracle HWM( High Water Mark)_第4张图片
为什么图中会出现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 [ | 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;--回缩索引

你可能感兴趣的:(数据库,oracle,Oracle)