欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

[Oracle]-性能优化工具(2)-ASH

程序员文章站 2023-01-26 20:15:36
ash和awr的关系 ash以v$session为基础,每秒采样一次,记录活动会话等待的事件。不活动的会话不会采样,采样工作由新引入的后台进程mmnl来完成。 ash内存记录数...

ash和awr的关系

ash以v$session为基础,每秒采样一次,记录活动会话等待的事件。不活动的会话不会采样,采样工作由新引入的后台进程mmnl来完成。
ash内存记录数据始终是有限的,为了保存历史数据,引入了自动负载信息库(automatic workload repository ,awr) 由后台进程mmon完成。ash信息同样被采集写出到awr负载库中。由于内存是有限的,所以mmnl进程在ash写满后会将信息写出到awr负载库中。ash也不是写出全部数据导awr,所一般只写入收集的10%的数据量,而且使用direct-path insert完成,尽量减少日志的生成,从而最小化性能影响。

总结一下:awr是根据snapshot采样间隔来进行整体性能判断的。而ash的粒度更细。比如你的awr是1小时采样一次,但是如果一个故障仅仅持续了5分钟,之前和之后数据库都正常,那么这5分钟到底发生了什么,要去看ash。
我们在监控数据库时,如果是当前正在发生的问题,我们可以通过v$session+v$sqlarea来找出性能最差的sql语句。如果在一个小时以内发生的我们可以通过生成ash报告来找出sql.如果是1小时以上或几天我们可以通过awr报告来找出几小时,几天以来最影响系统的sql语句。addm报告基于awr库,默认可以保存30天的addm报告。
我们也可以直接查询试图:
v$session (当前正在发生)
v$session_wait (当前正在发生)
v$session_wait_history (会话最近的10次等待事件)
v$active_session_history (内存中的ash采集信息,理论为1小时)
wrh$_active_session_history (写入awr库中的ash信息,理论为1小时以上)
dba_hist_active_sess_history (根据wrh$_active_session_history生成的视图)

ash的生成

执行如下脚本生成ash报告:
@?/rdbms/admin/ashrpt.sql
1. 你是一路回车,就是获取最近15分钟的ash报表。
2. 你根据oldest ash sample available 时间,然后回车,选择的是目前可以收集到的最长ash运行情况
3. 你可以选择oldest ash sample available和latest ash sample available之间时间,然后输入时长,比如30表示30分钟,取你要取的任何时段的ash报表
ash报表也可以直接手工获取,比如select output from table(dbms_workload_repository.ash_report_html( dbid,inst_num,l_btime,l_etime);
示例:
set pagesize 0
set linesize 121
spool d:\ash_rpt.html
select output from table(dbms_workload_repository.ash_report_html( 977587123,1,sysdate-30/1440,sysdate-1/1440));
spool off

--包详细参数:
dbms_workload_repository.ash_report_html(
l_dbid         in number, 
l_inst_num     in number, 
l_btime        in date,
l_etime        in date,
l_options      in number default 0,
l_slot_width   in number default 0,
l_sid          in number default null,
l_sql_id       in varchar2 default null,
l_wait_class   in varchar2 default null,
l_service_hash in number default null,
l_module       in varchar2 default null,
l_action       in varchar2 default null,
l_client_id    in varchar2 default null,
l_plsql_entry  in varchar2 default null)