DB兄”医院”历险记

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",共同学习,共同成长!!!

请使用浏览器的分享功能分享到微信等