小伙伴们,业务侧和运维组的有没有要求进行高水位线降低和空间回收的要求,这次解析HWM
1. 核心概念
- 表碎片数据块物理存储不连续,由频繁的DML操作(INSERT/UPDATE/DELETE)导致,造成I/O性能下降和空间浪费。
- 高水位线(HWM)表段中已被使用过的最大数据块位置。即使删除数据,HWM仍保持高位,导致Oracle不会自动回收空闲空间。
2. 影响与检测
影响:
- 查询性能下降(需扫描更多空闲块)
- 存储空间浪费
- 备份/恢复效率降低
检测脚本:
-- 先收集统计信息确保准确性
EXEC DBMS_STATS.GATHER_SCHEMA_STATS('HR');
-- 验证统计信息更新时间
SELECT table_name, last_analyzed FROM dba_tables WHERE owner = 'HR';
-- 检测表碎片率(浪费空间 >10% 需处理)-- owner替换为实际用户名
SELECT
owner,
table_name,
ROUND(segment_mb, 2) "Segment (MB)",
ROUND(actual_used_mb, 2) "Actual Used (MB)",
ROUND(segment_mb - actual_used_mb, 2) "Wasted (MB)",
ROUND((segment_mb - actual_used_mb) / segment_mb * 100, 2) "Fragmentation %"
FROM (
SELECT
t.owner,
t.table_name,
s.bytes / 1024 / 1024 AS segment_mb,
(t.num_rows * t.avg_row_len) / 1024 / 1024 AS actual_used_mb
FROM
dba_tables t
JOIN dba_segments s ON t.owner = s.owner AND t.table_name = s.segment_name
WHERE
t.owner = 'HR'
AND t.temporary = 'N'
AND s.segment_type = 'TABLE'
AND t.num_rows > 0
)
WHERE
segment_mb > 10 -- 仅检查大于10MB的表
AND (segment_mb - actual_used_mb) / segment_mb * 100 > 10 -- 碎片率>10%
ORDER BY
"Wasted (MB)" DESC;
--SYS
OWNER TABLE_NAME Segment (MB) Actual Used (MB) Wasted (MB) Fragmentation %
________ _________________________ _______________ ___________________ ______________ __________________
SYS TEST_FAST_INGEST 57 35.48 21.52 37.76
SYS IDL_UB2$ 17 0.13 16.87 99.26
SYS CUSTOMER_ORDERS_NOCOMP 112 97.08 14.92 13.32
SYS IDL_UB1$ 13 0.15 12.85 98.87
SYS OBJ$

最低0.47元/天 解锁文章
1936

被折叠的 条评论
为什么被折叠?



