分析HWM

article/2025/11/6 13:11:58
下面结合官方文档和实验介绍下HWM:
以下英文摘自11gR2官方文档:
HWM(high water mark):The boundary between used and unused space in a segment.
ORACLE9i之后开始使用自动段空间管理即ASSM,它使用位图来管理段空间的使用情况,如果表空间ASSM,则表空间中的段也是ASSM.

 At table creation, the HWM is at the beginning of the segment on the left. Because no data has been inserted yet, all blocks in the segment are unformatted and never used.
当表创建时,HWM开始于段的最左边。因为从来没有数据插入,所有在段里的块没有被格式化和使用。

Suppose that a transaction inserts rows into the segment. The database must allocate a group of blocks to hold the rows. The allocated blocks fall below the HWM. The database formats a bitmap block in this group to hold the metadata, but does not preformat the remaining blocks in the group.In Figure 12–24, the blocks below the HWM are allocated, whereas blocks above the HWM are neither allocated or formatted. As inserts occur, the database can write to any block with available space. The low high water mark (low HWM) marks the point below which all blocks are known to be formatted because they either contain data or formerly contained data.
假设一个事务将行插入到段。数据库必须分配一个组块的行。低于HWM分配的块。这组数据库格式的位图块的元数据,但不预先格式剩下的组块。在图12 - 24中,下面的块HWM分配,而块上面HWM既不分配或格式化。插入时,数据库可以写任何块可用空间。高水标低(低HWM)标志着点下面这所有的块都被格式化的,因为他们要么包含数据或以前包含数据。

In Figure 12–25, the database chooses a block between the HWM and low HWM and writes to it. The database could have just as easily chosen any other block between the HWM and low HWM, or any block below the low HWM that had available space. In Figure 12–25, the blocks to either side of the newly filled block are unformatted.
在图12-25,数据库选择HWM和低HWM和之间的一块写道。数据库也可以轻易选择其他块之间HWM和低HWM,或任何块低于低HWM可用空间。图12-25,块的新填充块无格式。



The low HWM is important in a full table scan. Because blocks below the HWM arformatted only when used, some blocks could be unformatted, as in Figure 12–25. Fthis reason, the database reads the bitmap block to obtain the location of the low HWM. The database reads all blocks up to the low HWM because they are known tbe formatted, and then carefully reads only the formatted blocks between the low HWM and the HWM.Assume that a new transaction inserts rows into the table, but the bitmap indicates that insufficient free space exists under the HWM. In Figure 12–26, the database advances the HWM to the right, allocating a new group of unformatted blocks.
HWM低是重要的在一个全表扫描。因为块低于HWM基于“增大化现实”技术格式化只使用时,一些街区可以无格式,如图12-25所示。F因此,数据库读取位图块获得低的位置HWM。数据库读取所有块的低HWM因为它们是已知的被格式化,然后仔细阅读只有格式化块之间的低HWM HWM。假设一个新的事务将行插入到表中,但位图显示HWM空闲空间不足存在。图12-26数据库右边的HWM进步,分配一个新组的非格式化块


When the blocks between the HWM and low HWM are full, the HWM advances to the right and the low HWM advances to the location of the old HWM. As the database inserts data over time, the HWM continues to advance to the right, with the low HWM always trailing behind it. Unless you manually rebuild, truncate, or shrink the object, the HWM never retreats.
当HWM之间的块和低HWM充满,HWM进步的正确的和低老HWM HWM进步的位置。作为数据库插入数据随着时间的推移,右边的HWM不断进步,HWM偏低总是落后。除非你手动重建、截断或缩小对象,HWM从不撤退。

以上通过官方文档理论的分析了HWM,下面我们通过实验来分析:

[oracle@localhost ~]$ cat /etc/redhat-release 
Red Hat Enterprise Linux Server release 5.5 (Tikanga)

SQL> select * from v$version where rownum=1;


BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production


SQL> show user;
USER 为 "HR"
SQL> desc t;
 名称                                    是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER(38)
 NAME                                               VARCHAR2(10)


SQL> select count(*) from t;


  COUNT(*)
----------
    327680

t是用户hr里的一张比较大的表。
我们在列id上建索引index_t:(下面有用)
SQL> create index index_t on t(id);


索引已创建。

分析一下表:
SQL> exec dbms_stats.gather_table_stats('HR','T');  oracle提供了这个分析包

PL/SQL 过程已成功完成。
当然你也可以使用之前版本提供的工具:
SQL>  analyze table t1 compute statistics;

表已分析。
删除分析:
SQL> analyze table t1 delete statistics;

表已分析。



Total Blocks 表示分配给表的总的blocks 数。
Unused Blocks 表示位于高水位线以上的从未使用的数据块个数。

上面的参数不一一介绍,感兴趣的可以研究。

通过执行计划分析:
SQL> set autotrace traceonly;
SQL> select * from t;(执行了两次,此为第二次结果)


已选择327680行。

执行计划
----------------------------------------------------------
Plan hash value: 1601196873


--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |   327K|  2240K|   172   (2)| 00:00:03 |
|   1 |  TABLE ACCESS FULL| T    |   327K|  2240K|   172   (2)| 00:00:03 |
--------------------------------------------------------------------------

统计信息
----------------------------------------------------------
          0  recursive calls
          0  db block gets
      22418  consistent gets
          0  physical reads
          0  redo size
    6379306  bytes sent via SQL*Net to client
     240710  bytes received via SQL*Net from client
      21847  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
     327680  rows processed
执行计划
----------------------------------------------------------
Plan hash value: 1601196873

从上面可以看出,逻辑读了22418次。

我们此时delete表t,但是不会降低HWM:



表t虽然被delete的那部分被删除,但是被占用的那部分内空间存仍然没被释放,可以通过alter table t move来释放存储空间:
alter table move 主要有两方面的作用:
1、用来移动table 到其他表空间。
2、用 来减少table 中的存储碎片,优化存储空间和性能。
SQL> alter table t move (tablespace users) online;(此时别的会话可以正常访问此表)
表已更改。
此时rows的rowid也会改变。
SQL> select * from t;   (执行了两次,此为第二次结果)


已选择131072行。




执行计划
----------------------------------------------------------
Plan hash value: 1601196873


--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |   327K|  2240K|   172   (2)| 00:00:03 |
|   1 |  TABLE ACCESS FULL| T    |   327K|  2240K|   172   (2)| 00:00:03 |
--------------------------------------------------------------------------




统计信息
----------------------------------------------------------
          1  recursive calls
          0  db block gets
       9274  consistent gets
          0  physical reads
          0  redo size
    4020151  bytes sent via SQL*Net to client
      96533  bytes received via SQL*Net from client
       8740  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
     131072  rows processed
此时的逻辑读已经降低为9274。

但是此时造成建立在id上的索引不可用:

此时我们可以通过重建索引来解决:
 alter index index_t rebuild (tablespace users)  online;(此时如果不加online,则不能进行delete,update,insert操作,对于大表来说,很慢)
SQL> alter index index_t rebuild online; 


索引已更改。
索引重新可以使用:


http://chatgpt.dhexx.cn/article/7N6fiOrB.shtml

相关文章

【计算广告】在线分配算法之 —— HWM(High water mark)介绍

该算法是雅虎工程师提出的一个解决合约制广告或者说GD(担保式投放)投放系统在线分配问题的贪心算法,思路很直接,下面是本人对照其论文整理的思路,里面有自己的理解。 论文题目:Ad Serving Using a Compact…

IMEI 码的校验和生成

IMEI 码的校验和生成 文章目录 IMEI 码的校验和生成IMEI 码Luhn算法代码实现C IMEI 码 IMEI 码,即手机的串号。它是 International Mobile Equipment Identity( 国际移动设备身份) 的简称,就像是手机的身份证,是用来帮助辨别手机身份真伪的。…

Android获取手机设备识别码(IMEI)和手机号码

最近看了下获取手机设备ID和手机信息以及SIM的信息例子,主要还是借鉴别人的,现在自己写一下,算是巩固加深了,也希望能给大家一个参考 必要的条件还是一部真机,SIM卡或者UIM卡。 首先,在AndroidMainfest.x…

手机设备标识码(IMEI、MEID、UDID、UUID、ANDROID_ID、GAID、IDFA等)

文章目录 Android篇1 IMEI和MEID2 DeviceId3 mac地址4 ANDROID_ID5 UUID6 OpenUDID7 Serial Number8 IDFA9 GAID iOS篇1 IMEI2 IDFA3 mac地址4 UDID5 UUID6 如何正确的获取设备的唯一标识7 什么是钥匙串 Android篇 1 IMEI和MEID (1) IMEI (International Mobile Equipment Id…

什么是IMEI / MEID?他们有什么不同?

摘要: 最近小编了解到一个新的概念:MEID码。说实话,一开始小编并不了解这是个什么。小编以为是不是打字的时候打错了啊,是不是要了解的是IMEI码呢?后来百度了一下才知道我理解错了。小编就做一回好学生,在苹果手机找回…

手机IMEI码规则介绍

2019独角兽企业重金招聘Python工程师标准>>> 手机IMEI码由15-17位数字组成。 第一部分 TAC,Type Allocation Code,类型分配码,由8位数字组成(早期是6位),是区分手机品牌和型号的编码&#xff0c…

android 华为 imei,华为手机怎么查看IMEI码?华为手机查询IMEI串号两种方法,华为imei...

华为手机怎么查看IMEI码?华为手机查询IMEI串号两种方法,华为imei 每一部手机的串号都是不同的,如果想要查看华为手机的IMEI串号,我们该怎么样来查询呢?下面一起来看看操作的方法吧。 华为手机查询IMEI串号两种方法 方法…

IMEI是什么? 怎样查手机串号IMEI

IMEI的基本含义 IMEI(International Mobile Equipment Identity,移动设备国际识别码,又称为国际移动设备标识)是手机的唯一识别号码。我们从这个缩写的全称中来分析它的含义:“移动设备”就是手机,不包括便…

智能手机串号IMEI码丢失(无效IMEI)解决恢复办法

本方法本少爷亲测可行,故做一记录如下: 准备工作: 1、手机已经ROOT。没有ROOT的下载ROOT大师即可ROOT。 2、下载移动叔叔工具箱 3、下载MTK6575主板序列号及IMEI生成器 详细步骤 1、记录你的手机IMEI串号:IMEI串号,可以…

手机的imei号的获取

手机的设备信息,是我们在做证书验证的时候不可缺少的,这里我会写一些我们常用的手机信息获取办法。TelephonyManager是我们手机管理的一个大的类,继承的Object。 1核心代码和权限 Context.getSyste…

获取手机唯一识别码IMEI

前言 获取IMEI相信大家非常熟悉,但是项目中使用时,发现当手机卡为电信的时候,获取的并不是IMEI,而是MEID,什么是MEID,为什么会出现这种情况呢? IMEI国际移动设备识别码(IMEI&#xf…

IMEI、IMSI、ICCID、SN是什么?意义和区别?通信模组或手机的唯一识别码

最近在做几个4G移动端的产品,初入行门有很多生涩的名词。想获取一个全球唯一ID作为设备后台管理编号,就扯出了 IMEI、IMSI、ICCID、SN 这几个东西。 IMEI IMEI:国际移动设备识别码 (International Mobile Equipment Identity&…

ProtcolBuffer基础原理

Protocol Buffer由Google出品的一款轻量而高效的数据序列化和反序列化的方法,下面的我们来介绍一下Protocol Buffer的内部实现原理。 1.类实例 编码包括数据的编解码和函数方法的还原 2.ProtcolBuffer的数据类型 TypeMeaningUsed For0Varintint32, int64, uint32, uint64,…

ADI Blackfin DSP处理器-BF533的开发详解13:LDF内存分配的详解(含源代码)

硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 功能介绍 ADSP上的LDF(Linker Description Files)连接器描述文件是处理器用来进行资源分配的文件,通过对LDF文…

M4内核的FPU/DSP使用总结

FPU简介 近年,在Cortex-M3之后ARM公司又推出Cortex-M4内核,ARM Cortex-M4处理器是由ARM专门开发的最新嵌入式处理器,在M3的基础上强化了运算能力,新加了浮点、DSP、并行计算等。Cortex-M4处理器的最大亮点之一,也是本文…

【STM32F407的DSP教程】第37章 STM32F407的FIR低通滤波器实现(支持逐个数据的实时滤波)

完整版教程下载地址:http://www.armbbs.cn/forum.php?modviewthread&tid94547 第37章 STM32F407的FIR低通滤波器实现(支持逐个数据的实时滤波) 本章节讲解FIR低通滤波器实现。 目录 37.1 初学者重要提示 37.2 低通滤波器介绍…

【STM32F429的DSP教程】第41章 FIR滤波器的群延迟(重要)

完整版教程下载地址:http://www.armbbs.cn/forum.php?modviewthread&tid94547 第41章 FIR滤波器的群延迟(重要) 本章节为大家介绍FIR滤波器的群延迟问题。 目录 41.1 FIR滤波后的群延迟 41.2 总结 41.1 FIR滤波后的群延迟 波…

STM32F407 DSP+FPU进行FFT变换(2)

STM32F407 DSPFPU进行FFT变换 接着上一篇继续,要用FFT运算的话,F4有FPU和DSP库,可以很方便让我们去对数据进行傅氏变换。首先得配置好DSP库和FPU。 配置DPS库和FPU CubeMX一般是默认配置开启FPU,但是DSP库需要自己去添加。这里…

【STM32F407的DSP教程】第41章 FIR滤波器的群延迟(重要)

完整版教程下载地址:http://www.armbbs.cn/forum.php?modviewthread&tid94547 第41章 FIR滤波器的群延迟(重要) 本章节为大家介绍FIR滤波器的群延迟问题。 目录 41.1 FIR滤波后的群延迟 41.2 总结 41.1 FIR滤波后的群延迟 波…

Powell算法、Powell修正算法_matlab仿真

1.鲍威尔基本算法的运算流程 1.采用坐标轮转法顺次沿n个坐标轴方向[e1,e2,...,en]进行一维搜索。然后以初始点X(0)和终点Xn(1)构成一个新的方向S(1),并以此方向为搜索方向在做一维搜索得到极小值点X(n1)(1)。 2.去初始点X0(2)X(n1)(1),并去掉元搜索方向组…