0

0

Oracle实例之HWM(高水位线)性能优化

絕刀狂花

絕刀狂花

发布时间:2025-07-20 10:08:14

|

781人浏览过

|

来源于php中文网

原创

最近,bi同事的反馈指出了一张表的数据查询速度非常慢,尽管该表的数据总量不足1万行。我们首先考虑的是高水位线(hwm)带来的性能问题,即高水位线下占用了大量数据块,而这些数据块中大部分是空闲的。

我们知道,在全表扫描时,高水位线下的所有数据块都会被扫描,因此扫描的数据块数量可能远远超过实际存储数据的数据块数量。

一、收集表的统计信息

要获取准确的高水位信息,首先需要收集统计信息,这样得到的信息才会相对准确。

ANALYZE TABLE table_name ESTIMATE STATISTICS;
ANALYZE TABLE table_name COMPUTE STATISTICS FOR TABLE FOR ALL INDEXES FOR ALL INDEXED COLUMNS;
execute dbms_stats.gather_table_stats(ownname => 'OWNER', tabname => 'TABLE_NAME', estimate_percent => null, method_opt => 'for all indexed columns', cascade => true);

二、查看表信息

查看表的块和行信息:

select t.TABLE_NAME, t.NUM_ROWS, t.BLOCKS, t.empty_blocks, t.LAST_ANALYZED from dba_tables t where table_name in ('TABLE_NAME');
SELECT COUNT(DISTINCT DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)) USED_BLOCK FROM TABLE_NAME;

Oracle实例之HWM(高水位线)性能优化

上述查询结果显示,当前表的行数为9651行,HWM下的数据块使用了716119个,而未使用的数据块为0个。

实际数据占用的数据块数量为152个。

从中可以看出,高水位线下有716119-152个数据块可以释放,这样每次全表扫描只需扫描152个数据块即可。

通过查看段大小来验证记录数和表大小是否一致,段大小为5.5G,9651行的记录几乎不可能达到这个大小,因此可以断定其中有很多空闲块。

select segment_name, bytes/1024/1024/1024 TSize_GB from dba_segments where segment_name='table_name' ---5876219904

Oracle实例之HWM(高水位线)性能优化

三、问题原因

MiniMax Agent
MiniMax Agent

MiniMax平台推出的Agent智能体助手

下载

什么情况下会导致上述问题,即高水位线下存在大量未使用的数据块?通常是大表(插入大量记录后)经过批量删除操作(delete),未释放高水位线所致。

  1. 全表扫描需要读取高水位线下的所有数据块,无论是否包含数据。
  2. 如果在插入数据时使用了append关键字,即使高水位线下有空闲的数据块,也会从高水位线上方的数据块进行分配,导致高水位线上升。

四、降低高水位的方法

  1. alter table table_name move; 此方法可以释放高水位,但需要重建索引。
  2. alter table table_name shrink space; 此方法可以释放高水位,但在执行前需要启用行移动:alter table table_name enable row movement;
  3. 使用导出/导入(exp/imp)方式重建表数据。
  4. 使用删除/创建(drop/create)方式重建表。
  5. 使用truncate表。
  6. alter table table_name deallocate unused; 此方法用于释放HWM上方的未使用空间,但不会释放HWM下方的自由空间,也不会移动HWM的位置。

五、高水位调整实施

  1. 统计信息收集(如上所述)。
  2. 查看执行计划:
SQL> set autotrace trace;
SQL> set timing on;
SQL> SELECT count(*) FROM TABLE_NAME;

Oracle实例之HWM(高水位线)性能优化

  1. 表移动:
alter table table_name move;

报错:ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired 查看被锁对象:

select object_name, machine, s.sid, s.serial# from v$locked_object l, dba_objects o, v$session s where l.object_id=o.object_id and l.session_id=s.sid;

执行后再查看执行计划统计信息:

Oracle实例之HWM(高水位线)性能优化

可以看到,统计信息中访问的数据块已经减少,全表扫描速度也大大提升。

  1. 索引重建:
alter index index_name rebuild online;

六、库高水位对象统计

①比较表的行数和表的大小关系。如果行数为0,而表的当前占用大小减去初始化时的大小(INITIAL_EXTENT)后依然很大,说明该表有高水位。

②行数和块数的比率,即查看一个块可以存储多少行数据。如果一个块存储的行数少于5行甚至更少,说明有高水位。注意,这两种方法都不是十分准确,需要对查询结果进行进一步筛选。在查询表的高水位时,首先需要分析表,以获取最准确的统计信息。

SELECT D.OWNER, ROUND(D.NUM_ROWS / D.BLOCKS, 2), D.NUM_ROWS, D.BLOCKS, D.TABLE_NAME, ROUND((d.BLOCKS*8-D.INITIAL_EXTENT/1024)/1024) t_size FROM DBA_TABLES D WHERE D.BLOCKS > 10 AND ROUND(D.NUM_ROWS / D.BLOCKS, 2) < 5 AND D.NUM_ROWS > 50 AND OWNER NOT LIKE '%SYS%' AND BLOCKS > 100 ORDER BY WASTE_PER DESC;

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
resource是什么文件
resource是什么文件

Resource文件是一种特殊类型的文件,它通常用于存储应用程序或操作系统中的各种资源信息。它们在应用程序开发中起着关键作用,并在跨平台开发和国际化方面提供支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

149

2023.12.20

append用法
append用法

append是一个常用的命令行工具,用于将一个文件的内容追加到另一个文件的末尾。想了解更多append用法相关内容,可以阅读本专题下面的文章。

343

2023.10.25

python中append的用法
python中append的用法

在Python中,append()是列表对象的一个方法,用于向列表末尾添加一个元素。想了解更多append的更多内容,可以阅读本专题下面的文章。

1070

2023.11.14

python中append的含义
python中append的含义

本专题整合了python中append的相关内容,阅读专题下面的文章了解更多详细内容。

174

2025.09.12

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

269

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

208

2023.12.29

oracle清空表数据
oracle清空表数据

当表中的数据不需要时,则应该删除该数据并释放所占用的空间。本专题为大家提供oracle清空表数据的相关文章,帮助大家解决该问题。

264

2023.08.16

Oracle中declare的使用
Oracle中declare的使用

Oracle DECLARE语句是PL/SQL编程语言中用于声明变量、常量、游标或异常的关键字。它的主要作用是在程序中定义这些对象,以便在后续的代码中使用。DECLARE语句的语法简单明了,可以根据需要声明多个对象。通过使用这些声明的对象,可以进行各种操作,如计算、查询数据库、处理异常等 。

202

2023.09.15

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP注册时短信通知功能
PHP注册时短信通知功能

共8课时 | 12.8万人学习

仿腾讯视频.电视剧首页
仿腾讯视频.电视剧首页

共11课时 | 4.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号