ITPub博客

首页 > 数据库 > Oracle > DB兄”医院”历险记

DB兄”医院”历险记

原创 Oracle 作者:chenoracle 时间:2020-05-13 14:39:29 0 删除 编辑

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

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29785807/viewspace-2691825/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
Oracle ACE、OCMU 用户组成员、Oracle 11g OCM、微信公众号"IT小Chen"

注册时间:2014-08-05

  • 博文量
    853
  • 访问量
    2727960