如何通过 dba_hist_active_sess_history 分析数据库历史性能问题
https://cloud.tencent.com/developer/article/2027417
分享两个实用SQL–查看故障时间等待事件、问题sql及会话访问次数
https://www.51cto.com/article/601971.html
DBA_HIST_ACTIVE_SESS_HISTORY查看历史等待事件
~ Active Session 活动会话
~ gv$active_session_history 每秒采集一次
~ dba_hist_active_sess_history 每10秒采集一次
背景
在很多情况下,当数据库发生性能问题的时候,我们并没有机会来收集足够的诊断信息,比如system state dump或者hang analyze,甚至问题发生的时候DBA根本不在场。这给我们诊断问题带来很大的困难。那么在这种情况下,我们是否能在事后收集一些信息来分析问题的原因呢?在Oracle 10G或者更高版本上,答案是肯定的。
本文我们将介绍一种通过dba_hist_active_sess_history的数据来分析问题的一种方法。
适用于
Oracle 10G或更高版本,本文适用于任何平台。
详情
在Oracle 10G中,我们引入了AWR和ASH采样机制,有一个视图gv$active_session_history会每秒钟将数据库所有节点的Active Session采样一次,而dba_hist_active_sess_history则会将gv$active_session_history里的数据每10秒采样一次并持久化保存。基于这个特征,我们可以通过分析dba_hist_active_sess_history的Session采样情况,来定位问题发生的准确时间范围,并且可以观察每个采样点的top event和top holder。下面通过一个例子来详细说明。
select session_id,sql_id,blocking_session,event,machine
from dba_hist_active_sess_history
where
sample_time > to_date('2022-05-08 21:10:00','yyyy-mm-dd hh24:mi:ss')
and
sample_time < to_date('2022-05-09 21:30:00','yyyy-mm-dd hh24:mi:ss');
select *
from dba_hist_active_sess_history d
where d.sample_time
between
to_date('2016-12-01 02:00:00', 'yyyy-mm-dd hh24:mi:ss')
and
to_date('2016-12-17 06:00:00', 'yyyy-mm-dd hh24:mi:ss')
;
--查看故障时间段等待事件、问题sql id及会话访问次数
--alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
select trunc(sample_time, 'mi') tm, sql_id, nvl(event,'CPU'),count(distinct session_id) cnt
from dba_hist_active_sess_history
where sample_time
between
to_date('2019-08-22 14:00:00','yyyy-mm-dd hh24:mi:ss')
and
to_date('2019-08-22 14:30:00','yyyy-mm-dd hh24:mi:ss')
group by trunc(sample_time, 'mi'), sql_id,nvl(event,'CPU')
order by cnt desc;
--查看该sql相关的等待事件及对应的会话访问次数
select sql_id, nvl(event, 'CPU'), count(distinct session_id) sz
from dba_hist_active_sess_history a, dba_hist_snapshot b
where sample_time
between
to_date('2024-03-20 16:00:00','yyyy-mm-dd hh24:mi:ss')
and
to_date('2024-03-25 16:00:00','yyyy-mm-dd hh24:mi:ss')
and sql_id = '2kqt7896g23um'
and a.snap_id = b.snap_id
and a.instance_number = b.instance_number
group by sql_id, nvl(event, 'CPU')
order by sz desc;
最新评论
这个牛
放下欲望,男人从来不醉,充分且必要
勇气、责任、自信、创新,为天下先!
软件即数据,软件即服务,软件即管理,软件就是对人类各种社会活动的仿真和记录。软件很重要,但软件不可能凌驾于业务之上,尤其不可能高人一等。