AWR你好(1)文中提到过,AWR、ASH和ADDM三者之间有些猫腻,那在对ASH简单做了介绍以后,那这次我们就来看ADDM.

ADDM(Automatic Database Diagnostic Monitor)数据库自动诊断监控(o小白自己翻译的啊……有点不太顺),在AWR生成了快照以后,oracle会自动调用ADDM,对最近的两个快照之间的状态进行分析,总结可能导致数据库性能问题的原因并生成报表。ADDM的主要依据就是database time,那什么是database time呢,也就是一个数据库请求到响应的时间。

那o小白自己的理解来说,就是ADDM自动把可能导致数据库响应时间最慢的事件给找了出来,从症状开始,比如哪句sql语句导致的响应时间变慢,然后分析根本原因,比如是因为db file scattered read,那下面o小白会给大家看个例子,是o小白自己做的ADDM的实验。

实验背景是o小白创建了一张表,addmtest,用于测试ADDM.

首先,有心的朋友会发现,昨天的那张脚本的图里有一个脚本叫ADDMRPT,那这个脚本就是生成ADDM表报的工具,那前面介绍过了ADDM是根据快照来进行自动分析的,那和前面的AWR脚本一样,指定起始快照和结束快照以后就可以生成ADDM报表了,唯一不同的是ADDM只支持txt模式,不支持HTML格式。实验步骤几乎完全一致,也就不贴出来了,不过这里一点需要注意的,o小白在做实验的时候碰到了最后结果是这样的情况。

 

图示的结果说NOT ENOUGH DATABASE TIME,而且从上面的Average Database Load和Database Time这两个都是0,也就是说,这两个快照之内数据库几乎没有任何负载,那ADDM自然也就没东西好分析了,o小白实验环境,自然是没有负载的,如果是生产库,那大概是至少30分钟收集一次吧,当然也要根据业务的情况进行调整。

那o小白就模拟一下负载,编写了一段脚本,循环往addmtest里面进行自插入(原来的内容是dba_tables),循环个20次。然后再次运行脚本,生成了报表结果如下。(太长了截一段)

 

那可以看到,ADDM诊断是SQL Tuning,发现了sql语句,然后找到对应的wait event,后面几个finding也是一样的内容, 因为o小白是循环插入的嘛~

那可以看到ADDM还是很好用的,特别对于新手来说,可以让oracle自动发现问题所在,但是所谓的工具也仅仅是工具而已,不可能那么智能,有的时候ADDM的分析诊断也并不准确,可能按照他所说的做反而会导致其他的问题,那只能提供一个参考,更多还是要看DBA的经验,而这种经验自然是要日积月累的,厚积薄发~