DB 兄 ” 医院 ” 历险记
说明: 近期看了梁老师的《收货,不止SQL 优化》,记录下 Oracle 五个报告的用途和关系。案例中所有医学相关信息都是乱写的,只是为了对比说明下 Oracle 五个报告的用途和关系,请勿对号入座。
一:全身检查
话说DB 兄近期经常 996 加班,早上起来感觉浑身不舒服,但具体哪块不舒服又不确定,于是来到医院做个全身体检。体检报告里会有各种指标信息,比如内科、肝功二项、尿常规、血常规、幽门螺旋杆菌抗体等。
AWR :近期一套 Oracle 数据整体运行缓慢,收集了负载较高时间段的 AWR 报告,检查数据库整体性能, AWR 报告里有各种指标信息,比如等待事件、 TOP SQL 等。


二:针对全身检查中异常指标进行针对性检查
拿到体检报告,发现幽门螺旋杆菌抗体偏高,但这个指标只是说明胃里有幽门螺杆菌生长,具体已经引发什么疾病还要进一步检查。还需要去胃肠科专门对胃做一次检查,例如胃镜、吹气等,检查结束后会在出具一个胃相关的检查报告。
ASH :查看到 free buffer waits 和 direct path read 等待时间和平均等待时间较高,可能和 buffer 太小、排序、 hash join 、全表扫描等有关,但是在 AWR 报告中,并没有指出哪条 SQL 导致的 free buffer waits 和 direct path read ,这时可以看下这一时间段的 ASH 报告。 ASH 提供了等待事件和 SQL 直接关联的信息。通过 ASH 报告可以看到引起 free buffer waits 等待事件的 SQL 是 :update t1 set id=100 where id=1; 引起 direct path read 等待事件的 SQL 是 :select id from t1 where id=1;

三:根据报告给出初步建议
出具的报告上仍然是一些指标数字等,外行根本看不懂,需要找到医生对报告进行解读,医生看完报告后会写一个病例说明,例如 最后诊断是 胃溃疡,建议患者饮食规律,精神放松,忌食生、冷、粗、硬和刺激性食物。
ADDM :通过 AWR 知道了数据库缓慢和 free buffer waits 、 direct path read 等待事件有关,通过 ASH 知道了 free buffer waits 、 direct path read 等待事件和 update t1 set id=100 where id=1; select id from t1 where id=1; 语句有关,根据这些信息可知数据库缓慢和表 t1 有关,此时可以生成 ADDM 报告,查看 Oracle 针对当前情况给出的建议,通过 ADDM 报告可知, Oracle 评估这几条 SQL 存在性能问题,建议进行 SQL 优化。


四:更深入检查异常部分细节内容
但是胃溃疡到什么程度也不好说,还要做个胃活检才清楚是否发生病变,于是又出具一个报告,最终显示良性,没有病变,还是要注意饮食,注意休息。
对这两条 SQL 进行优化需要知道 SQL 执行计划和统计信息等,可以生成 AWRSQRPT 报告:


查看到执行计划是t1 全表扫描,而 id=1 条件选择性很高,为什么没有使用索引,可能索引失效、无索引、统计信息不准确等,例如 id 列无索引,可以创建 id 列的索引解决这个问题。
五:对比不同时间段报告信息
这时DB 兄告诉医生,其实去年他也体检过,检查结果也是胃溃疡,希望医生对比下去年和今年的检查报告,看看病情是加重了还是减轻了。于是医生拿着两张报告,对比发现患者的胃溃疡较去年有所减轻。
AWRDD :数据库运行有一段时间了,同时收集下昨天和今天相同时间段的性能报告 AWRDD ,看下性能对比情况。


六:测试数据如下
create table t1 ( id int );
begin
for i in 1 .. 100000000 loop
insert into t1 values ( i );
end loop ;
commit ;
end ;
/
exec dbms_workload_repository.create_snapshot ();
select id from t1 where id = 1 ;
select id from t1 where id = 2 ;
select id from t1 where id = 3 ;
update t1 set id = 100 where id = 1 ;
rollback ;
exec dbms_workload_repository.create_snapshot ();
报告收集脚本
1 awr
@/ rdbms / admin / awrrpt.sql
2 ash
@/ rdbms / admin / ashrpt.sql
3 addm
@/ rdbms / admin / addmrpt.sql
4 awrsqrpt
@ ? / rdbms / admin / awrsqrpt.sql
5 awrdd
@ ? / rdbms / admin / awrddrpt.sql
欢迎关注我的微信公众号"IT小Chen",共同学习,共同成长!!!