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 操作可能锁表,需在业务低峰期执行。