ASH分析常规流程和SQL语句
step1 验证导出的ASH时间范围
select
t.dbid, t.instance_number, min(sample_time), max(sample_time), count(*) session_count
from DBA_HIST_ACTIVE_SESS_HISTORY t
group by t.dbid, t.instance_number
order by dbid, instance_number;
step2 确认问题发生的精确时间范围
select
dbid, instance_number, sample_id, sample_time, count(*) session_count
from DBA_HIST_ACTIVE_SESS_HISTORY t
group by dbid, instance_number, sample_id, sample_time
order by dbid, instance_number, sample_time;
step3 确定每个采样点的top n event
select t.dbid,
t.sample_id,
t.sample_time,
t.instance_number,
t.event,
t.session_state,
t.c session_count
from (select t.*,
rank() over(partition by dbid, instance_number, sample_time order by c desc) r
from (select
t.*,
count(*) over(partition by dbid, instance_number, sample_time, event) c,
row_number() over(partition by dbid, instance_number, sample_time, event order by 1) r1
from DBA_HIST_ACTIVE_SESS_HISTORY t
where sample_time >
to_timestamp('2022-09-27 07:00:00',
'yyyy-mm-dd hh24:mi:ss')
and sample_time <
to_timestamp('2022-09-27 08:00:00',
'yyyy-mm-dd hh24:mi:ss')
) t
where r1 = 1) t
where r < 3
order by dbid, instance_number, sample_time, r;
step4 观察每个采样点的等待链
`select
level lv,
connect_by_isleaf isleaf,
connect_by_iscycle iscycle,
t.dbid,
t.sample_id,
t.sample_time,
t.instance_number,
t.session_id,
t.sql_id,
t.session_type,
t.event,
t.session_state,
t.blocking_inst_id,
t.blocking_session,
t.blocking_session_status
from DBA_HIST_ACTIVE_SESS_HISTORY t
where sample_time >
to_timestamp('2022-09-27 07:20:00',
'yyyy-mm-dd hh24:mi:ss')
and sample_time <
to_timestamp('2022-09-27 07:40:00',
'yyyy-mm-dd hh24:mi:ss')
start with blocking_session is not null
connect by nocycle
prior dbid = dbid
and prior sample_time = sample_time
and prior blocking_inst_id = instance_number
and prior blocking_session = session_id
and prior blocking_session_serial# = session_serial#
order siblings by dbid, sample_time;`
step5 基于第4步的原理来找出每个采样点的最终top holder
select t.lv,
t.iscycle,
t.dbid,
t.sample_id,
t.sample_time,
t.instance_number,
t.session_id,
t.sql_id,
t.session_type,
t.event,
t.seq#,
t.session_state,
t.blocking_inst_id,
t.blocking_session,
t.blocking_session_status,
t.c blocking_session_count
from (select t.*,
row_number() over(partition by dbid, instance_number, sample_time order by c desc) r
from (select t.*,
count(*) over(partition by dbid, instance_number, sample_time, session_id) c,
row_number() over(partition by dbid, instance_number, sample_time, session_id order by 1) r1
from (select
level lv,
connect_by_isleaf isleaf,
connect_by_iscycle iscycle,
t.*
from DBA_HIST_ACTIVE_SESS_HISTORY t
where sample_time >
to_timestamp('2022-09-27 07:30:00',
'yyyy-mm-dd hh24:mi:ss')
and sample_time <
to_timestamp('2022-09-27 07:40:00',
'yyyy-mm-dd hh24:mi:ss')
start with blocking_session is not null
connect by nocycle
prior dbid = dbid
and prior sample_time = sample_time
and prior blocking_inst_id = instance_number
and prior blocking_session = session_id
and prior
blocking_session_serial# = session_serial#) t
where t.isleaf = 1) t
where r1 = 1) t
where r < 3
order by dbid, sample_time, r;