原文地址:http://blog.csdn.net/ziyuanzhu/article/details/52511869
一. 高水位(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操作,不由应用程序完成,需要管理员定期执行。