直接看v$session_event或awr报告“top sql by reads”,重点分析time_waited与total_waits乘积定位高耗时sql,再结合sql_id查执行计划及p1/p2反查段对象,识别回表、索引聚簇因子或统计信息问题。

查哪个SQL在拖慢系统
直接看 v$session_event 或 AWR 报告里的 “Top SQL by Reads” —— 不要只盯着等待时间,重点看 time_waited 和 total_waits 的乘积(即总耗时),再结合 sql_id 定位真实罪魁。
常见误判:看到某条 SQL 的 db file sequential read 平均等待时间 > 5ms 就断定是磁盘慢。实际可能是这条 SQL 每次执行读 2000 个索引块,而其中 1800 块都不在 buffer cache 中。
- 用
SELECT sql_id, event, time_waited, total_waits FROM v$session_event WHERE event = 'db file sequential read' ORDER BY time_waited DESC快速抓出高耗时会话 - 拿到
sql_id后,立刻跑DBMS_XPLAN.DISPLAY_CURSOR('&sql_id')看执行计划,盯紧有没有TABLE ACCESS BY INDEX ROWID紧跟在INDEX RANGE SCAN后面 - 如果
Rows列预估是 100,实际返回 12000,说明优化器严重低估回表代价,很可能触发大量单块读
定位物理读发生在哪个对象上
P1(文件号)、P2(起始块号)是关键线索,它们不是“随机数字”,而是能反查到具体段对象的坐标。
别靠猜 —— 直接用 dba_extents 查:
SELECT segment_name, segment_type, owner FROM dba_extents WHERE file_id = &P1 AND &P2 BETWEEN block_id AND block_id + blocks - 1;
结果大概率是索引段或表段。如果是索引,再查它的 clustering_factor;如果是表,检查 CHAIN_CNT 和 AVG_ROW_LEN 是否远超 DB_BLOCK_SIZE。
-
P2 = 1通常表示在读数据文件头,不是业务问题,可忽略 - 如果同一个
segment_name频繁出现在多条db file sequential read记录中,优先怀疑该对象的访问路径或物理存储质量 - 注意:
dba_extents查询依赖最近一次ANALYZE或DBMS_STATS.GATHER_*_STATS,过期统计会导致定位偏差
判断是不是回表成了瓶颈
索引扫得快,但整体慢?八成卡在 TABLE ACCESS BY INDEX ROWID。Oracle 每次回表都要按 ROWID 单独定位一个数据块,如果这些块物理离散,就会把随机 I/O 拉满。
三个硬信号:
- 执行计划里
TABLE ACCESS BY INDEX ROWID的Cost占总Cost70% 以上 -
v$segment_statistics中该表的logical reads是其索引段的 5 倍以上,且physical reads持续上涨 - 对应 SQL 的
buffer gets很高,但disk reads更高,buffer hit ratio低于 90%
这时别急着加索引,先看能不能覆盖查询:比如原语句是 SELECT name, email FROM users WHERE status = 'A',现有索引是 (status),那就建 (status, name, email) —— 避免回表。
别把 FAST FULL SCAN 当万能解药
INDEX FAST FULL SCAN 走的是多块读(db file scattered read),吞吐高,但它绕过了 B-tree 结构,不保证顺序,也不支持 ORDER BY 或部分谓词下推。
强行加 /*+ index_ffs(t idx) */ 可能更慢:
- 如果
SELECT *或查了非索引列,仍会回表,反而增加 I/O - 如果索引
leaf blocks数量远大于表blocks,FFS 读的块更多,物理读不降反升 - 优化器自动选 FFS 时(比如
WHERE status IN ('A','B')过滤率差),别用 hint 压制它 —— 那往往是更优选择
真正该警惕的是:执行计划里明明有合适索引,却走了全表扫描,同时 db file sequential read 还很高 —— 那说明可能有行迁移、块损坏或统计信息严重倾斜,得查 DBA_TABLES.CHAIN_CNT 和 DBA_INDEXES.CLUSTERING_FACTOR。











