前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【基础知识】高水位线(HWM),低HWM(low HWM)

【基础知识】高水位线(HWM),低HWM(low HWM)

作者头像
甚至熊熊
发布2021-07-15 12:54:58
3K0
发布2021-07-15 12:54:58
举报

最近遇到一个需要降低高水位线的场景,首先梳理一下高水位线的知识。

一、什么是高水位线(High-Water Mark,HWM)?

如果我们把表想象成一个平面结构,或者想象成从左到右依次排开的一系列块。

高水位线(High-Water Mark,HWM)就是包含过数据的最右边的块,也可以想象为一个水库的历史最高水位。

HWM是表段的专用术语。

从上图可见,新创建的表HWM位于第一个块中,随着数据库不断插入,HWM会升高。

当我们删除掉表中部分或者全部数据的时候,可能就会有许多块不再包含数据,但是这些块仍然在高水位线下。直到重建、truncate或者收缩(shrink space)这个表(具体的降低高水位的方式,后面会单独说)。

注意:

  1. shrink space是10g新特性,只有当段在一个ASSM表空间中才支持这个特性
  2. 自动段空间管理(Automatic Segment Space Management,ASSM)
  3. 手动段空间管理(Manual Segment Space Management,MSSM)

二、高水位线对数据库操作有什么影响?

Oracle在全表扫描时会扫描HWM之下的所有块,即使其中不包含任何数据。这直接影响了全表扫描的性能,特别是当HWM之下的大多数块都为空时。

举例来说,一个100万行数据的表,执行select count(*)操作,然后delete掉其中数据,再次select count(*),会发现执行时间一样长。这是因为Oracle忙于读取HWM之下的所有块,并查看其中是否包含数据。

三、低HWM(low HWM)又是什么?

这块比较难懂,我们要知道 low HWM只存在于自动段空间管理(ASSM)中。

1.先了解下MSSM和ASSM

使用CREATE TABLESPACE 语句创建一个本地管理的表空间(locally managed tablespace)时,可以使用SEGMENT SPACE MANAGEMENT 子句来设定段(segment)内的可用/已用空间如何管理。

代码语言:javascript
复制
[SEGMENT SPACE MANAGEMENT MANUAL|AUTO]
  • AUTO: 使用位图(bitmap)管理段内的可用空间。此处的位图用于描述段内每个数据块(data block) 是否有足够的可用空间来插入(insert)新数据。随着一个数据块中可用空间的变化,它的状态也被及时地反映到位图中。Oracle 使用位图可以更自动化地管理段内的可用空间。这种空间管理形式被称为自动段空间管理(ASSM)。 ASSM是创建本地管理的表空间的默认选项。
  • MANUAL: 使用可用freelist来管理段内的可用空间。freelist记录了所有可以被用于插入新数据的数据块。新建表所分配的segment没有block被格式化,
代码语言:javascript
复制
--查看我的虚拟机内表空间的段空间管理方式
SQL> select tablespace_name,SEGMENT_SPACE_MANAGEMENT from dba_tablespaces;
TABLESPACE_NAME              SEGMEN
---------------------------  -------
SYSTEM                       MANUAL
SYSAUX                       AUTO
UNDOTBS1                     MANUAL
TEMP                         MANUAL
USERS                        AUTO
TEST                         AUTO

下面是官方文档说明:

  • MSSM模式,当一个会话第一次向表中插入行的时候,数据库会去寻找freelist中未被使用的块。如果没有找到,那么就会预格式化(preformats)一组块,并放到freelist中,然后开始插入数据到块中。MSSM模式,全表扫描会读取HWM下的所有块。
  • ASSM模式,当一个会话第一次向表中插入数据,数据库会格式化单个位图块(the database formats a single bitmap block)。位图会跟踪段里面块的状态,取代了MSSM的freelist。数据库使用bitmap去寻找空闲的块,同时在填充数据前格式化每一个块。ASSM会分散插入到各个块中,目的是避免并发问题。

ASSM段中的每个数据块都处于以下状态之一:

  • HWM之上的块是未格式化的,也从未被使用过
  • HWM之下的话,有如下几种情况:
    1. 已分配,但目前未格式化和未使用
    2. 格式化,并包含数据
    3. 格式化,但是为空,因为数据已被删除

2.什么是低HWM(low HWM)

直接说我的理解:low HWM的意义就是提高全表扫描效率,低于low HWM的块不需要判断是否格式化,直接读取,而low HWM 到 HWM之间的块,因为有的格式化,有的没有,所以需要先判断是否格式化过,再读取,这样效率就低。

  • 在MSSM表空间中每个段只有一个HWM
  • 在ASSM表空间中,除了HWM外,还有一个低HWM。
  • 在MSSM中,当HWM向前推进时,HWM之下的所有块都会被格式化并立即有效,Oracle可以安全地读取这块。
  • 而对于ASSM,HWM推进时,Oracle并不会立即格式化所有块,而是在第一次真正使用这些块时才会完成格式化,以便安全地读取(这里的“安全”意思就是判断是否格式化)。
  • 第一次使用会发生在数据库向给定块插入记录时。 对于ASSM,数据会被插入到位于低HWM和HWM之间的任意块中,而在这个区域中的许多块可能没有被格式化。
  • 新数据要插入,但是通过bitmap确认到HWM下空间不足,则HWM会向右推进,分配一组未被格式化的块。
  • HWM向右推进后,low HWM向右移动到老HWM的位置。

注意:官方文档上额外说到,如果在 low HWM之下有空余空间的任何块,也会被插入。

  • HWM以上的都是未分配、未格式化
  • HWM以下的都是被分配了的,有的格式化,有的没有
  • low HWM以下的都是格式化了的

所以,当全面扫描一个段时,必须知道被读取的块是否“安全”,或是否未格式化。

为了避免对表中的每一个块都进行这种“安全/不安全”检查,Oracle同时维护了一个低HWM和一个HWM。当Oracle全表扫描至HWM后,会对低HWM以下的所有块直接读取并加以处理。而对介于低HWM和HWM之间的块,则会更加小心,需要参考管理这些块所用的ASSM位图信息以便查看应该读取哪些块,以及哪些块应该被忽略。

3.一点额外补充

在itpub上看到一个人举得例子比较好

MSSM就好比在VM创建虚拟机的时候,选择【立即分配所有磁盘】,要多大空间直接就给了。 ASSM就像是不勾选,创建完成虚拟机,df也是看到想要的大小,但是实际上只是个标识,没有实际分配,用到的时候再分。

4.所参考的材料

  1. 《Oracle编程艺术深入理解数据库体系结构》
  2. Oracle Database Concepts
  3. 一篇itpub的讨论:http://www.itpub.net/thread-1226844-2-1.html
  4. 一篇别人的理解:https://blog.csdn.net/kramer2009/article/details/7302272
  5. ACED大神写的:https://www.askmac.cn/archives/low-or-high-hwm.html

四、总结

  1. bitmap的数据结构得看看
  2. 如何确定HWM位置也得看看
  3. 如何降低HWM还需要总结下
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-06-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据库学习笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、什么是高水位线(High-Water Mark,HWM)?
  • 二、高水位线对数据库操作有什么影响?
  • 三、低HWM(low HWM)又是什么?
    • 1.先了解下MSSM和ASSM
      • 2.什么是低HWM(low HWM)
        • 3.一点额外补充
          • 4.所参考的材料
          • 四、总结
          相关产品与服务
          数据库
          云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档