为什么Oracle 19c AWR中的物理读比逻辑读还多_分析全表扫描与IO负载

浅丽姑娘_8985

浅丽姑娘_8985

2026-05-05

366人浏览

原创

物理读不可能真正多于逻辑读,AWR中出现该现象必因统计口径错误、指标误读或采样异常;根本原因是Oracle内部强制logical reads≥physical reads。

物理读(physical reads)不可能真正“比逻辑读(logical reads)还多”——这是数据库底层机制决定的。如果你在awr报告里看到 physical reads 数值 > logical reads,那基本可以断定:数据源或统计口径被污染了,或者你误读了指标位置。

看错地方:Physical Reads 和 Logical Reads 不在同一统计维度

AWR报告中存在两组完全独立的读取计数,常被混淆:

  • Load Profile 区域的 Logical Reads 和 Physical Reads 是“每秒/每事务”的速率值(单位:blocks/sec 或 blocks/txn),它们可直接比较比例,但不能简单比大小;
  • Instance Efficiency Percentages 下的 Buffer Hit % 是派生值:(1 − physical reads / logical reads) × 100,这里才要求 logical reads ≥ physical reads;
  • 若你在 SQL Statistics → SQL ordered by Physical Reads 里看到某条SQL的 disk_reads 高于另一条SQL的 buffer_gets,这完全正常——因为它们属于不同SQL、不同执行次数,不具备跨语句加总可比性。

典型误判场景:把“Top SQL的 disk_reads 总和”和“全库 logical reads 每秒值”放一起比,就像拿一小时的快递单量去比单个快递员一分钟的步数。

真出现 physical reads > logical reads 的唯一可能:采样窗口异常或统计重置

Oracle内部逻辑强制 logical reads = consistent gets + db block gets,而 physical reads ≤ logical reads 是硬约束。突破该约束只发生在以下情况:

  • AWR快照期间执行过 ALTER SYSTEM FLUSH BUFFER_CACHE,导致后续所有读都变物理读,但 logical reads 计数因缓存清空而被重置或延迟上报;
  • 数据库启用了 DB_FLASHBACK 且大量回滚段访问触发一致性读构造,此时 consistent gets 可能被低估(尤其在高并发长事务下);
  • 使用了外部表(ORACLE_LOADER)或 Data Pump 直接路径读,这类I/O不计入 logical reads 统计,但会反映在 physical reads 中;
  • RAC环境中节点间统计未完全同步,跨实例聚合时产生重复计数(尤其在 v$sysstat 视图直查时)。

验证方式:运行 SELECT name, value FROM v$sysstat WHERE name IN ('session logical reads', 'physical reads');,对比两个值——只要这个查询结果满足 physical reads ≤ session logical reads,就说明AWR里的“异常”是展示聚合问题,不是真实违反机制。

全表扫描如何推高 physical reads 却未必拉低 buffer hit

全表扫描(FULL TABLE SCAN)本身不必然导致高 physical reads,关键看表是否“热”:

QuantOracle
QuantOracle

63个确定性量化金融计算器 + 10个通过MCP的复合工作流。期权定价、Greeks、奇异衍生品、风险指标、投资组合优化……

下载
  • 冷表首次扫描:全部块从磁盘加载 → physical reads 高,buffer hit 瞬间跌;
  • 热表反复扫描:块已在 buffer cache 中 → physical reads 为0,但 logical reads 极高(比如1亿行表扫一次就是上百万 consistent gets);
  • 大表+小 db_cache_size:只缓存部分块,每次扫描都命中一部分、miss一部分 → physical reads 持续稳定在中高位,buffer hit 卡在70%~85%,最迷惑人;
  • 注意 direct path read:当全表扫描数据量超过 _small_table_threshold(默认2% buffer cache),Oracle自动切到直接路径读,绕过buffer cache → 这类读计入 physical reads,但不增加 logical reads,也不影响 buffer hit 计算——这才是真正让“physical reads 看似反超”的元凶。

查证是否发生直接路径读:SELECT event, waits FROM v$session_event WHERE event = 'direct path read'; 或在AWR的 Top 5 Timed Events 中找该事件。

IO负载判断不能只盯 physical reads 数值本身

高 physical reads 是否构成瓶颈,取决于它背后的I/O质量:

  • 看 Average Synchronous Single-Block Read Latency:持续 > 20ms 表示存储响应慢,哪怕 physical reads 只有100/s也危险;
  • 看 Physical Read Total IO Requests Per Sec vs Physical Read Total Bytes Per Sec:前者高后者低 → 小IO随机读多(索引扫描或碎片化表),后者高前者低 → 大IO顺序读多(全表扫描或分区剪枝);
  • 对比 db file sequential read 和 db file scattered read 的等待时间与次数:前者占比高通常意味着索引效率差或链式行多;后者占比高则要检查是否缺失分区裁剪或并行度设置不当;
  • 警惕“伪高IO”:归档日志写入(ARCH 进程)、RMAN备份、甚至 DBMS_STATS 收集统计信息时的采样扫描,都会推高 physical reads,但和业务SQL无关。

真正需要干预的信号,是 physical reads 上升的同时,DB Time 显著增长 + Top 5 Timed Events 中 User I/O 类事件占据主导 + 对应SQL的 elapsed_time 和 disk_reads 强相关——脱离这三者的任意一个谈“物理读多”,都是在调优真空里打转。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

oracle

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

相关专题

更多
C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

3549

3

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

2023.07.25

2428

9

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

2023.08.02

1360

5

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.09

1298

4

c语言random函数用法
c语言random函数用法

c语言random函数用法:1、random.random,随机生成(0,1)之间的浮点数;2、random.randint,随机生成在范围之内的整数,两个参数分别表示上限和下限;3、random.randrange,在指定范围内,按指定基数递增的集合中获得一个随机数;4、random.choice,从序列中随机抽选一个数;5、random.shuffle,随机排序。

2023.09.05

1416

5

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2023.09.20

2318

7

c语言get函数的用法
c语言get函数的用法

get函数是一个用于从输入流中获取字符的函数。可以从键盘、文件或其他输入设备中读取字符,并将其存储在指定的变量中。本文介绍了get函数的用法以及一些相关的注意事项。希望这篇文章能够帮助你更好地理解和使用get函数 。

2023.09.20

3820

8

c数组初始化的方法
c数组初始化的方法

c语言数组初始化的方法有直接赋值法、不完全初始化法、省略数组长度法和二维数组初始化法。详细介绍:1、直接赋值法,这种方法可以直接将数组的值进行初始化;2、不完全初始化法,。这种方法可以在一定程度上节省内存空间;3、省略数组长度法,这种方法可以让编译器自动计算数组的长度;4、二维数组初始化法等等。

2023.09.22

17915

6

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

549

3

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程