Oracle 高水位线(High Water Mark, HWM)

1. 高水位线(HWM)的定义

  • 基本概念:HWM 是 Oracle 数据库中一个段(如表、索引)中已分配并被格式化(Formatted)的存储空间的最高位置。它标识了该段历史上曾达到的最大数据块使用量。

  • 物理意义:HWM 以下的块(即使为空)在全表扫描时会被读取,而 HWM 以上的块未被初始化,不会被扫描。

2. HWM 的类型

(1) 段级 HWM(Segment HWM)
  • 传统 HWM:用于手动段空间管理(MSSM)和自动段空间管理(ASSM)。

  • 特点:全表扫描时读取所有 HWM 以下的块。

(2) 低 HWM(Low HWM)
  • 仅适用于 ASSM:在自动段空间管理中引入。

  • 特点:标识段中最后一个"完全空闲"的块。全表扫描时,仅扫描低 HWM 以下的块,可能跳过部分空闲块,提升性能。

3. HWM 的作用

  • 空间管理:标记段的存储上限,避免每次插入都重新分配空间。

  • 性能影响:

    • 全表扫描效率:HWM 以下的块会被扫描,即使其中无数据。

    • 空间浪费:若表中数据大量删除,HWM 不会自动下降,导致存储空间无法被其他段复用。

4. HWM 的管理与调整

(1) HWM 的上升
  • 触发条件:

    • 插入新数据导致现有空间不足,Oracle 自动扩展段(分配新区间)。
  • HWM 位置:每次扩展后,HWM 移动到新区间的起始块。

(2) HWM 的下降
  • 默认行为 :HWM 不会自动下降,即使删除所有数据。

  • 手动降低 HWM:

-- 方法1:表重组(需要额外空间)

ALTER TABLE <表名> MOVE;

-- 方法2:收缩表空间(需启用行移动)

ALTER TABLE <表名> ENABLE ROW MOVEMENT;

ALTER TABLE <表名> SHRINK SPACE COMPACT; -- 仅整理碎片

ALTER TABLE <表名> SHRINK SPACE; -- 整理碎片并重置 HWM

  • 限制:

    • SHRINK SPACE 要求表位于 ASSM 表空间中。

    • 操作期间会锁定表,可能影响业务。

5. HWM 的监控

(1) 查询数据字典视图

-- 查看表的块分配情况

SELECT

table_name,

blocks, -- HWM 以下已使用的块数

empty_blocks, -- HWM 以上的空闲块数

num_rows -- 表中的行数(需统计信息准确)

FROM dba_tables

WHERE table_name = 'YOUR_TABLE';

(2) 使用 DBMS_SPACE 包

-- 分析段的空间使用详情(包括 HWM 信息)

DECLARE

l_unformatted_blocks NUMBER;

l_unformatted_bytes NUMBER;

l_fs1_blocks NUMBER;

l_fs1_bytes NUMBER;

l_fs2_blocks NUMBER;

l_fs2_bytes NUMBER;

l_fs3_blocks NUMBER;

l_fs3_bytes NUMBER;

l_fs4_blocks NUMBER;

l_fs4_bytes NUMBER;

l_full_blocks NUMBER;

l_full_bytes NUMBER;

BEGIN

DBMS_SPACE.SPACE_USAGE(

segment_owner => 'SCOTT',

segment_name => 'EMP',

segment_type => 'TABLE',

unformatted_blocks => l_unformatted_blocks,

unformatted_bytes => l_unformatted_bytes,

fs1_blocks => l_fs1_blocks, -- 0-25% 空闲块

fs1_bytes => l_fs1_bytes,

fs2_blocks => l_fs2_blocks, -- 25-50% 空闲块

fs2_bytes => l_fs2_bytes,

fs3_blocks => l_fs3_blocks, -- 50-75% 空闲块

fs3_bytes => l_fs3_bytes,

fs4_blocks => l_fs4_blocks, -- 75-100% 空闲块

fs4_bytes => l_fs4_bytes,

full_blocks => l_full_blocks, -- 完全满的块

full_bytes => l_full_bytes

);

DBMS_OUTPUT.PUT_LINE('HWM 以下的块总数: ' || (l_fs1_blocks + l_fs2_blocks + l_fs3_blocks + l_fs4_blocks + l_full_blocks));

END;

6. HWM 对性能的影响

(1) 全表扫描效率
  • 问题:若 HWM 远高于实际数据量(例如表曾存储 100 万行,删除后剩 1 万行),全表扫描仍需读取 HWM 以下所有块,导致 I/O 浪费。

  • 优化:定期收缩表或重组表以降低 HWM。

(2) 空间浪费
  • 问题:HWM 以上的空闲块无法被其他段复用。

  • 优化 :使用 SHRINK SPACE 或导出/导入数据释放空间。

7. HWM 与 ASSM 的关系

  • ASSM 的优势:

    • 引入低 HWM(Low HWM),允许全表扫描跳过部分空闲块。

    • 自动管理空间分配,减少碎片。

  • ASSM 的局限性:

    • 无法完全避免 HWM 问题,仍需手动干预优化。

8. 实际案例

场景:某表频繁删除数据,HWM 过高导致查询变慢。

解决方案:

启用行移动并收缩表:

ALTER TABLE orders ENABLE ROW MOVEMENT;

ALTER TABLE orders SHRINK SPACE;

重建索引:

ALTER INDEX orders_pk REBUILD;

收集统计信息:

EXEC DBMS_STATS.GATHER_TABLE_STATS('SCOTT', 'ORDERS');

  • HWM 是 Oracle 空间管理的核心机制,直接影响存储利用率和查询性能。

  • 关键操作:

    • 定期监控 HWM(通过 DBA_TABLES 或 DBMS_SPACE)。

    • 对频繁删除的大表使用 SHRINK SPACE 或 MOVE 操作。

    • 结合 ASSM 自动管理,减少手动维护成本。

  • 注意事项:HWM 操作可能锁表,需在业务低峰期执行。

相关推荐
姚远Oracle ACE3 小时前
对比测试了 openGauss、PostgreSQL、Oracle、MySQL 的CPU 指令数
mysql·postgresql·oracle
CJi0NG3 小时前
【自用】MySQL-多表查询
数据库·mysql
雨落在了我的手上4 小时前
MySQL数据库基础(12):事务
数据库·mysql
D姐聊门店4 小时前
门店收银系统断网兜底怎么设计:本地账本、离线续传与日终对账的工程实现
数据库·saas
用户8662978480084 小时前
抓包看 KingbaseES 内部协议?官方给了个现成工具
数据库
wefg14 小时前
【Redis】安装与启动
数据库·redis·缓存
大圣编蚕4 小时前
常见的 Redis 面试题(高频整理)
数据库·redis·缓存
派小心.5 小时前
网站统计采样数据的误差核对
大数据·服务器·前端·数据库·人工智能·小程序·数据分析
龙腾AI白云5 小时前
数字孪生、具身智能、世界模型三者交叉
数据库·人工智能·机器学习·flask·pygame
SelectDB技术团队6 小时前
Apache Doris 基于 Lance 的向量检索深度解析
数据库·数据仓库·数据分析·湖仓一体·apache doris·lakehouse·多模湖仓