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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-09 02:20:36

Oracle 高水位(HWM)回收原理及操作方法的相关文章

Oracle 高水位(HWM: High Water Mark)

一. 准备知识:ORACLE的逻辑存储管理. ORACLE在逻辑存储上分4个粒度: 表空间, 段, 区 和 块. 1.1 块: 是粒度最小的存储单位,现在标准的块大小是8K,ORACLE每一次I/O操作也是按块来操作的,也就是说当ORACLE从数据文件读数据时,是读取多少个块,而不是多少行. 每一个Block里可以包含多个row. 1.2 区: 由一系列相邻的块而组成,这也是ORACLE空间分配的基本单位,举个例子来说,当我们创建一个表Dave时,首先ORACLE会分配一区的空间给这个表,随着不

探究 Oracle 高水位对数据库性能影响

2016-08-11 陈龙 恩墨学院 探究 Oracle 高水位对数据库性能影响1大家好!我是来自云和恩墨的陈龙,目前主要负责Oracle技术支持工作.在我开始学习Oracle 的时候就听eygle老师说过,要想学好技术,一定要要多做实验,多做学习记录,理论与实践相结合,才能真正理解吸收那些知识,所以今天我想分享一下对Oracle高水位线与SQL访问性能相关性的研究体会.谈不上很深入的研究,只是想与大家分享我的Oracle学习过程,希望能与大家交流进步.之所以分享这个学习内容,是因为在我曾经经历

Oracle 高水位问题

Oracle 对数据段的管理有一个高水位(HWM, High Water Mark)的概念.高水位是数据段中使用过和未使用过的数据块的分界线.高水位以下的数据块是曾使用过的,以上的是从未被使用或初始化过的. 当 Oracle 进行全表扫描(FTS, Full table scan)的操作时,它会读高水位下的所有数据块.如果高水位下还有很多空闲空间(碎片),读取这些空闲数据块会降低操作的性能. 当针对一个表的删除操作很多时,表会产生大量碎片.删除操作释放的空间不会被插入操作立即重用,甚至永远也不会

oracle高水位

oracle高水位http://www.cnblogs.com/chuyuhuashi/p/3548260.htmlhttp://blog.csdn.net/wyzxg/article/details/5631721 数据表删除数据或者数据分区后,数据文件并没有减小.这是oracle数据库高数位high water mark造成的.尽管用delete删除了数据,数据已经不在数据块中,但是,原有的数据块并不会被回收回去,只是被标记为空闲可用的了.就是说空间只要被划分给了oracle,形式上就会被o

[Oracle]高水位标记(HWM)

(一)高水位标记(High Water Mark,HWM)的概念 所谓高水位标记,是指一个已经分配的段中,已经使用的空间与未使用的空间的分界线.在表的使用过程中,随着数据的不断增多(insert),HWM不断向数据段未使用部分方向移动,而在删除数据(delete)的过程中,HWM并不会向反方向移动,即使删除全部数据,HWM依然不会改变.但是如果使用了truncate命令,则表的HWM会被重置为0. 图1.segment (二)高水位标记的影响 全表扫描要读出直到HWM标记的所有的属于该表的数据块

Oracle高水位High Water Mark(HWM)简介

1.什么是高水位 高水位是Oracle中使用和未使用空间中的边界线,也可以理解为数据文间和非数据文间的分界线,但是这里的数据文件指代的是存储过数据的数据文件,而非仅仅是数据表中有数据的数据文件. 2.高水位对于检索的影响 假设我们有个表有2百万行数据存储在几个区中,假如我们删除一百万条数据.尽管数据区中的数据没有了,但是Oracle中占用的区的数据空间仍然不变,与原来二百万条数据占用的数据空间是一样的.当我们在数据库中执行查询时,Oracle仍会遍历所有的数据块,即便这些数据块中没有数据.从这个

Oracle 高水位说明和释放表空间,加快表的查询速度

高水位的介绍 数据库运行了一段时间,经过一些列的删除.插入.更改操作有些表的高水位线就有可能和实际的表存储数据的情况相差特别多,为了提高检索该表的效率,建议对这些表进行收缩: 查找高水位线的表 查找表需要的存储空间:表以数据块的形式存储在数据文件中,表的存储结构是:行×行数,如果知道了总共有多少行,每行的平均长度,两者相乘,再除于90%的使用率,那么就可以知道实际需要存储的空间: 表的存储结构; 从统计信息得出平均每行的长度和总共的行数,从而知道存储的SIZE: 查找表实际存储的空间:数据实际存

MOVE降低高水位 HWM

--创建实验表空间SQL> create tablespace andy03 datafile '/home/oracle/app/oradata/orcl/andy03.dbf'  size 10M autoextend on next 30M; --创建实验数据SQL> create table andy03 tablespace andy03  as select * from dba_objects ; SQL> insert into   andy03   select * f

Oracle高水位线(HWM)及性能优化

说到HWM,我们首先要简要的谈谈ORACLE的逻辑存储管理.我们知道,ORACLE在逻辑存储上分4个粒度:表空间,段,区和块. (1)块:是粒度最小的存储单位,现在标准的块大小是8K,ORACLE每一次I/O操作也是按块来操作的,也就是说当ORACLE从数据文件读数据时,是读取多少个块,而不是多少行. (2)区:由一系列相邻的块而组成,这也是ORACLE空间分配的基本单位,举个例子来说,当我们创建一个表PM_USER时,首先ORACLE会分配一区的空间给这个表,随着不断的INSERT数据到PM_