概述

深入理解HWM对于做数据库优化是必须掌握的一个基础,很多时候我们以为删了数据后表应该会快很多,但是得到的结果却很不理想,这其中就涉及到HWM方面了,也是truncate和delete不同的地方。


一、什么是水线 (High Water Mark)?

所有的 oracle 段(segments,在此,为了理解方便,建议把 segment 作为表的一个同义词) 都有一个在段内容纳数据的上限,我们把这个上限称为"high water mark"或 HWM。这个 HWM是一个标记,用来说明已经有多少没有使用的数据块分配给这个 segment。

HWM 通常增长的幅度为一次5个数据块,原则上 HWM 只会增大,不会缩小,即使将表中的数据全部删除,HWM还是为原值。

HWM 很象一个水库的历史最高水位,这也就是 HWM 的原始含义,当然不能说一个水库没水了,就说该水库的历史最高水位为0。但是如果我们在表上使用了 truncate 命令,则该表的 HWM 会被重新置为0。

HWM本身的信息是储存在段头.在段空间是手工管理方式时,ORACLE是通过FREELIST(一个单向链表)来管理段内的空间分配.在段空间是自动管理方式时(ASSM),ORACLE是通过BITMAP来管理段内的空间分配.


二、HWM 数据库的操作有如下影响:

1、全表扫描通常要读出直到 HWM 标记的所有的属于该表数据库块,即使该表中没有任何数

据。

2、即使 HWM 以下有空闲的数据库块,键入在插入数据时使用了 append 关键字,则在插入时使用 HWM 以上的数据块,此时 HWM 会自动增大。


三、如何计算一个表的 HWM ?

1、首先对表进行分析:

ANALYZE TABLE ESTIMATE/COMPUTE STATISTICS;

2、计算HWM

SELECT blocks, empty_blocks, num_rows FROM user_tables WHERE table_name = ;

说明:

BLOCKS 列代表该表中曾经使用过得数据库块的数目,即水线。

EMPTY_BLOCKS 代表分配给该表,但是在水线以上的数据库块,即从来没有使用的数据块。

3、实例

1)查看表段

create table test_hwm2 as select * from dba_objects;

SELECT segment_name, segment_type, blocks FROM dba_segments WHERE segment_name='TEST_HWM2';

2) 分析表

ANALYZE TABLE TEST_HWM2 ESTIMATE STATISTICS;

3)计算HWM

SELECT table_name,num_rows,blocks,empty_blocks FROM user_tables WHERE table_name='TEST_HWM2';

总的块数是1275,没有使用的块是3,也就是TEST_HWM2的HWM为1275-3+1=1273

注意:

这里DBA_SEGMENTS.BLOCKS 表示分配给这个表的所有的数据库块的数目。USER_TABLES.BLOCKS 表示已经使用过的数据库块的数目。


四、Oracle 表段中的高水位线 HWM

在 Oracle 数据的存储中,可以把存储空间想象为一个水库,数据想象为水库中的水。水库中的水的位置有一条线叫做水位线,在Oracle中,这条线被称为高水位线(High-warter mark,HWM)。在数据库表刚建立的时候,由于没有任何数据,所以这个时候水位线是空的,也就是说 HWM 为最低值。当插入了数据以后,高水位线就会上涨,但是这里也有一个特性,就是如果你采用 delete 语句删除数据的话,数据虽然被删除了,但是高水位线却没有降低,还是你刚才删除数据以前那么高的水位。也就是说,这条高水位线在日常的增删操作中只会上涨,不会下跌。

下面我们来谈一下 Oracle 中 Select 语句的特性。Select 语句会对表中的数据进行一次扫

描,但是究竟扫描多少数据存储块呢,这个并不是说数据库中有多少数据,Oracle 就扫描

这么大的数据块,而是 Oracle 会扫描高水位线以下的数据块。

如果是一张刚刚建立的空表,你进行了一次 Select 操作,那么由于高水位线 HWM 在最低的0位置上,所以没有数据块需要被扫描,扫描时间会极短。而如果这个时候你首先插入了一千万条数据,然后再用 delete 语句删除这一千万条数据。由于插入了一千万条数据,所以这个时候的高水位线就在一千万条数据这里。后来删除这一千万条数据的时候,由于 delete 语句不影响高水位线,所以高水位线依然在一千万条数据这里。这个时候再一次用 select 语句进行扫描,虽然这个时候表中没有数据,但是由于扫描是按照高水位线来的,所以需要把一千万条数据的存储空间都要扫描一次,也就是说这次扫描所需要的时间和扫描一千万条数据所需要的时间是一样多的。


之前小编也写了个存储过程是专门来计算HWM的,大家也可以通过那个方法来计算,降低HWM可以使用rebuild、truncate、shrink、move等操作,后面会介绍下怎么通过move去降低HWM,感兴趣的朋友可以关注下!!

oracle性能优化求生指南_oracle性能优化:高水位线(HWM)详解--如何计算HWM相关推荐

  1. 学习笔记:ORACLE 性能优化求生指南

    第一章.ORACLE性能调优:一种系统化方法 数据库优化顺序:     1.调整SQL,PL/SQL 代码及优化物理设计(分区,索引)尽可能的减少应用的请求:     2.减少对锁,闩锁,缓存及ORA ...

  2. oracle性能优化求生...,Oracle,SQL性能优化之探究|《oracle性能优化求生指南》

    摘 要 在数据库应用中,根据用户提交的查询请求,如何才能精炼又高效地得到查询结果?从多个角度描述怎样优化SQL语句.实验结果表明,SQL优化能够减轻系统资源的占用,满足用户的要求. 关键词 SQL优化 ...

  3. oracle性能优化求生指南_Vue项目性能优化--实践指南,网上最全最详细

    点击上方 "程序员小乐"关注, 星标或置顶一起成长 第一时间与你相约 每日英文 Some happened could not forget, even forget also o ...

  4. java性能优化权威指南_Java性能优化权威指南 PDF扫描[132MB]

    Java性能优化权威指南主要为Java SE 和Java EE 应用的性能调优提供建议.主要包括以下几方面:性能监控.性能分析.Java HotSpot VM 调优.高效的基准测试以及Java EE ...

  5. Web必备性能压力测试工具WebBench与ApcheBench(ab)详解

    在运维工作中,压力测试是一项很重要的工作.比如在一个网站上线之前,能承受多大访问量.在大访问量情况下性能怎样,这些数据指标好坏将会直接影响用户体验.但是,在压力测试中存在一个共性,那就是压力测试的结果 ...

  6. 小程序setdata优化_微信小程序 setData的使用方法详解

    微信小程序 setData的使用方法详解 微信小程序 setData的使用方法详解 最近在使用微信小程序的setData时,遇到了以下问题.如下: 官网文档在使用setData()设置数组对象的某个元 ...

  7. oracle高压水位线,Oracle 高水位线详解(HWM)

    HWM:高水位线, 可用空间与已用空间的分界线,标记着段空间使用情况. 所有的oracle段(segments,在此,为了理解方便,建议把segment作为表的一个同义词) 都有一个在段内容纳数据的上 ...

  8. oracle表稅片整理,oracle_Oracle表碎片整理操作步骤详解,高水位线(HWL)下的许多数据 - phpStudy...

    Oracle表碎片整理操作步骤详解 高水位线(HWL)下的许多数据块都是无数据的,但全表扫描的时候要扫描到高水位线的数据块,也就是说oracle要做许多的无用功!因此oracle提供了shrink s ...

  9. oracle如何启动和停止服务,CentOS启动和停止服务详解

    CentOS启动和停止服务详解 服务简介 Linux 系统服务是在Linux启 动时自动加载, 服务的添加.删除.自动运行及状态 CAMS 在安装过程中会自动添加相关的服务,例如: service c ...

最新文章

  1. 腾讯是一只邪恶的小企鹅
  2. Maven搭建JavaFX项目
  3. 尼日利亚学生开发者,用阿里云PAI打造了卡通头像神器
  4. Cocos2d-x 3.1.1 Lua演示样例 ActionManagerTest(动作管理)
  5. 信奥中的数学:二次互反律
  6. http://circles.arenaofthemes.com/
  7. 随想录(学习消费类soc芯片)
  8. com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field FileSize
  9. [msi]获取msi安装包的ProductCode
  10. 「代码随想录」本周学习小结!(动态规划系列四)
  11. 编程之美 4.4点是否在三角形内
  12. 如何设计和实现微信公众号关注后48小时内定时给粉丝自动推送客服消息?
  13. Debian配置主机名,域名,网卡IP地址
  14. 【智能制造】制造业信息化与工业4.0
  15. 密钥创建ssh-keygen
  16. linux code lite编译c,CentOS 6.2编译安装CodeLite 5.3
  17. UE4中的LookAt
  18. 开源好项目|码市 AndroidiOS App 源码开源
  19. Heat模板及简单应用
  20. mac 版 Goland 使用教程一

热门文章

  1. Qt creator5.7 OpenCV249之resize函数(含源码下载)
  2. 电脑 linux系统下载官网,红旗Linux操作系统
  3. php 判断下载状态,php下获取http状态的实现代码
  4. java httpclient 异步请求_Java利用httpasyncclient进行异步HTTP请求
  5. python做插件应用_Python插件机制实现详解
  6. 前端基础-html-表格的结构标签(了解)
  7. qt widget 窗口句柄的问题
  8. poj3320 尺取法 挑战程序设计竞赛
  9. shell获取命令行结果指定列(指定列结果)
  10. Win7中多账户设置自动登录的图文方法