oracle direct path read等待事件处理案例

Posted 雅冰石

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle direct path read等待事件处理案例相关的知识,希望对你有一定的参考价值。

一 问题描述

收到短信告警,提示direct path read(110)。

直接路径读取不过SGA缓存,直接从磁盘上读数据,每次查询都会产生大量的物理读,导致IO比较高,影响数据库性能。

二 排查思路

生成AWR报告及ASH报告,查看相关内容。

2.1 生成ASH报告

2.1.1 生成ASH报告

执行以下命令,生成ASH报告:

@?/rdbms/admin/ashrpt.sql

2.1.2 查看ASH报告

2.2.2.1 查看Top Events

 可以看到direct path read占比63%。

2.2.2.2 查看该等待时间对应的sql

 2.2 生成AWR报告

2.2.1 生成AWR报告

@?/rdbms/admin/awrddrpt.sql

2.2.2 查看AWR报告

2.2.2.1 查看top sql

 

 可以看到AWR报告捕获到的sql和ASH报告捕获到的是同一个sql。

2.2.2.2 查看占用物理读比较多的对象

 

 可以看到上面那个慢sql所查询的表SC_TIMING占用了大量物理读。

2.3 优化捕获到的慢sql

2.3.1 查看执行计划

SELECT WORK_ORDER_NO FROM sc_timing WHERE PROCESS_STATUS = '02' AND PROCESS_USER = :1

AWR报告显示平均需要7秒,我自己试了下,是2.6秒。

#查看执行计划

执行set autotrace on;

执行该sql:

 可以看到该sql走了全表扫描,没走索引,很多物理读和逻辑读。

2.3.2 优化该sql

在重复值不高的查询条件上建索引:

CREATE INDEX eom.ind_process_user ON  eom.sc_timing(process_user);

再次查询,只需要0.09秒了。

建完索引后,再次查看执行计划,看到走索引了,物理读和逻辑读大大减少:

 

以上是关于oracle direct path read等待事件处理案例的主要内容,如果未能解决你的问题,请参考以下文章