AWR中真正吃CPU的SQL需关注累计CPU消耗而非单次耗时,应结合Elapsed Time与Executions计算平均耗时,并检查Buffer Gets/Physical Reads比值、执行计划合理性、Child Number差异及绑定变量影响。
怎么看AWR里真正吃CPU的SQL
awr报告中top sql by cpu time看似直接,但实际常被误导——比如某条sql排第一,可它每秒只执行1次、单次耗时200ms,而另一条每秒跑50次、单次4ms的sql,总cpu消耗更高却排不进前五。关键不是看“单次最慢”,而是看“累计开销最大”。
实操建议:
- 在AWR报告的
SQL ordered by CPU Time部分,重点看Elapsed Time (s)和Executions两列,手动算出平均单次耗时(Elapsed Time / Executions),再结合执行频次判断是否真有压力 - 注意
Buffer Gets远高于Physical Reads的SQL,大概率是逻辑读密集型,说明可能缺索引或走了全表扫描但数据还在buffer cache里——这类SQL容易在CPU上“空转” - 如果某SQL的
CPU Time占总DB Time > 15%,且Executions稳定在高位,基本可以锁定为根因候选
物理读高但CPU不高?先确认是不是真的慢
Top SQL by Physical Reads反映的是I/O压力,但高物理读≠响应慢。比如一条报表SQL扫了10GB历史表,物理读高、执行时间长,但它本就不该实时跑;而另一条OLTP语句每次只读几十行却频繁触发物理读,才是真正要命的问题。
实操建议:
- 查
Physical Reads的同时,一定对照Rows Processed和Executions:如果Physical Reads / Rows Processed > 10,说明每行数据平均要读10多个块,极大概率存在索引缺失或统计信息陈旧 - 检查
SQL Profile或执行计划里的TABLE ACCESS FULL对象是否本应走索引——特别是WHERE条件字段没建索引,或建了但选择性差(如status IN ('A','B','C')) - 留意
Direct Path Read等待事件占比高的SQL,它意味着Oracle绕过了buffer cache做直接读,常见于大结果集排序或并行查询,这类操作本身合理,但若出现在短事务里就值得怀疑
用awrsqrpt.sql快速定位具体SQL文本和执行计划
AWR报告里只给SQL_ID,不显示完整SQL和执行计划,光看指标没法下手优化。必须回溯到原始语句和执行路径。
实操建议:
- 在数据库服务器上运行:
$ORACLE_HOME/rdbms/admin/awrsqrpt.sql,按提示输入SQL_ID、快照范围、输出格式(推荐html) - 生成的报告里重点关注
Execution Plan部分,比对Rows(预估)和A-Rows(实际),若相差超1个数量级,说明统计信息严重不准,DBMS_STATS.GATHER_TABLE_STATS得立刻安排 - 如果执行计划里出现
NESTED LOOPS外层驱动表返回百万行,内层没走索引,这就是典型“循环放大”问题,优先加索引或改写为HASH JOIN
别忽略Child Number和Bind Peek的影响
同一个SQL_ID可能对应多个Child Number,不同子游标执行计划可能完全不同。AWR默认只汇总主游标(Child Number = 0)的数据,而真实慢的可能是Child Number = 3那个用了错误绑定变量值的版本。
实操建议:
- 查
v$sql时务必带上child_number和is_bind_sensitive字段:SELECT sql_id, child_number, is_bind_sensitive, plan_hash_value FROM v$sql WHERE sql_id = 'xxx' - 如果
is_bind_sensitive = 'Y',说明该SQL对绑定变量敏感,不同变量值可能触发不同执行计划——这时必须用DBMS_XPLAN.DISPLAY_CURSOR(sql_id, child_number)逐个看每个子游标的实际计划 - 遇到
Bind Peek导致的计划倾斜(比如一个值走索引、另一个值走全表),临时方案是加OPT_PARAM('_optim_peek_user_binds' 'false'),长期方案是升级到12c+用自适应执行计划或SQL Plan Baseline固化
真正难的不是找哪条SQL排第一,而是搞清同一SQL_ID下不同Child Number的行为差异,以及绑定变量如何悄悄改变执行路径——这些细节藏在v$sql和DBMS_XPLAN里,不在AWR报告表面。










