一 问题描述
收到短信告警,提示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秒了。
建完索引后,再次查看执行计划,看到走索引了,物理读和逻辑读大大减少: