你的位置:首页 > 数据库

[数据库]Oracle 高水位(HWM)回收原理及操作方法


一.  高水位(HWM)及其产生原因

       High Water Mark,HWM) 是Oracle(Segment)级别的概念。在仅有DML(比如delete,insert)操作时,高水位线只会增长,不会降低。具体来说,由于程序使用的delete语句不回收使用过的空间,数据虽然删除了,但是高水位线却没有降低,仍然处于之前的水位。

         下图为一个Segment内高水位不断增长的示意图:

          注:一个表在初次插入记录时,Oracle会为其分配Segment和block。

  

         插入大量数据后,高水位线随之增长

          

         当数据被删除(Delete)后,高水位线并未下降

     

       数据block       已分配的block      未分配block

图1. 段(Segment) 内数据块(block)使用示意图

二.  回收操作的目

        1. 降低Oracle数据库中某些段(Segment)的高水位线,减少使用空间,从而避免不必要的表空间文件膨胀。在此稍作解释:

            如上一节所述,随着高水位线的增长,表空间文件中的used space部分会逐渐增大,当所有的free  space均被使用后,表空间文件的大小会在操作系统级别增大,直到达到最大可扩展大小。如下图所示:

        2. 提高表的扫描效率:由于Oracle的select语句会扫描高水位线以下的所有block,已分配而无数据的block过多时,必然会影响语句的执行效率。而降低高水位能提高这一效率。

三.  回收高水位的方法和操作步骤

                在查询过参考资料、咨询过相关专家、并且在测试系统充分测试后,在期权生产系统中对当前表空间的一些表进行了高水位回收。择一例并附步骤解释如下:

        操作对象选择当前数据表空间TX_DATA_TBS中的BK_OPT_CUST_HOLD_DETAIL表。

        此操作在关闭应用程序后执行,并在执行后重新开启程序。

        步骤主要分为三个:

                       1.    操作前状态检查,供操作后比对;

                       2.    高水位回收操作;

                       3.    操作后状态检查,与操作前状态比对。

         以下为详细步骤,关键查询结果用不同颜色标注。

          1.操作前状态检查

           -- 查看各表空间的空余空间(free space),此时TX_DATA_TBS表空间空余部分(free space)为721MB。

-- 查看表空间文件状态,可见TX_DATA_TBS表空间文件当前大小为9900 MB。

-- 查看待回收的表状态。 -- 查询表BK_OPT_CUST_HOLD_DETAIL记录数。

-- 查询BK_OPT_CUST_HOLD_DETAIL表上的索引状态。

-- 分析BK_OPT_CUST_HOLD_DETAIL表的状态。

-- 查询BK_OPT_CUST_HOLD_DETAIL表的高水位状态。可知回收前该表所在段共占用122234个block。

-- 查询该表所在段占用磁盘大小。目前该表所在段共占用955MB。

2.高水位回收操作 -- 由于shrink space操作需要使用“行移动”功能,需要在操作前开启该功能。

-- 收缩表,回收高水位。

-- 关闭“行移动”功能。

3.操作前状态检查 -- 查询表记录数、索引情况。与操作前比对,未发生改变。

-- 再次分析BK_OPT_CUST_HOLD_DETAIL表的状态。

-- 再次查询BK_OPT_CUST_HOLD_DETAIL表的高水位状态。可知回收后该表所在段共占用599 个block,回收122234-599 = 121635个block。

-- 再次查询该表所在段占用磁盘大小。回收后该表所在段共占用4.875 MB,回收950MB。

 

-- 再次查询表空间使用情况。与回收前对比,表空间空余空间上涨1671-721 = 950 MB,与表回收空间相同。

-- 但是表空间文件大小仍为9900 MB。可见shrink space操作仅作用于数据段Segment,而对表空间文件级别的大小并无影响。如要改变表空间文件大小,需要另外使用表空间级别的resize操作。 用下图可简单解释回收前后表空间内部空间的变化。

 

四.  小结 

1.回收高水位操作shrink space可对高水位之下未储存数据的block加以回收,并降低高水位线。既能减少空间使用,又能提高查询效率,而对表内的数据、表上的索引没有影响。

2.回收高水位操作shrink space是表和段级别的操作,能释放表空间文件内的空间,但不能缩小表空间文件的大小。

3.回收操作是DDL操作而非DML操作,不由应用程序完成,需要管理员定期执行。