oracle数据库,怎么降低高水位线

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle数据库,怎么降低高水位线相关的知识,希望对你有一定的参考价值。

参考技术A 无法是 老生常谈的 truncate 、move 、shrink space

实际上 大多数表不需要降高水位,不要迷信高水位
参考技术B select blocks, empty_blocks from dba_tables where table_name='xxx' and owner='xx';blocks就是已经分配的空间即HWM,实际分配的空间,不是实际大小追问

delete大量数据后,高水位线没降下来,表空间没有释放,原来占用5g,delete之后还是占用5g,怎么把高水位线降下来,释放表空间

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操作,不由应用程序完成,需要管理员定期执行。

 
       
 

以上是关于oracle数据库,怎么降低高水位线的主要内容,如果未能解决你的问题,请参考以下文章

Oracle高水位线 HWM降低技巧

降低Oracle高水位线的方法

Oracle 高水位(HWM)回收原理及操作方法

oracle 如何查看表 高水位线

Oracle 高水位问题

oracle 分区表怎么回收高水位