首页 > 数据库 >Oracle数据库 ASH视图详解

Oracle数据库 ASH视图详解

时间:2024-07-16 20:30:10浏览次数:13  
标签:视图 event sample active session time Oracle ASH id

Oracle ASH视图详解

ASH视图基础

v$active_session_history、dba_hist_active_sess_history

数据来源:

MMON进程收集数据库实例性能及会话活动的大量统计数据到SGA,并定期存储到SM/AWR组件中的数据字典

用途:

显示采样的会话活动信息,动态视图中每秒一行记录,历史视图中每10秒一行记录

结构:

通过用户手册了解视图的结构信息。与v$session视图的信息近似,但不包含inactive状态的会话信息

利用ASH视图监控数据库性能

会话监控语句

SELECT inst_id
      ,sid
      ,username
      ,machine
      ,program
      ,module
      ,action
      ,sql_id
      ,event
      ,blocking_session
      ,logon_time
      ,prev_exec_start
      ,client_info
  FROM gv$session
 WHERE status = 'ACTIVE'
   AND TYPE <> 'BACKGROUND'
 ORDER BY inst_id
         ,sid;

历史活动会话检查

-- 查看最近10分钟,按等待事件的数量降序排序
SELECT event
      ,COUNT(*)
  FROM gv$active_session_history a
 WHERE a.sample_time > SYSDATE - 1 / 144
 GROUP BY event
 ORDER BY COUNT(*) DESC;


-- 查询每分钟的采样次数
SELECT trunc(sample_time,'mi')
      ,COUNT(1)
  FROM gv$active_session_history
 GROUP BY trunc(sample_time,'mi')
 ORDER BY 1;


-- 查看最近10分钟,按等待事件和sql_id分组
SELECT event
      ,sql_id
      ,COUNT(1)
  FROM gv$active_session_history
 WHERE sample_time > SYSDATE - 1 / 144
 GROUP BY event
         ,sql_id
 ORDER BY COUNT(*) DESC;


-- 查询指定采样时间段内,按照每分钟和等待事件分组,统计数量
SELECT trunc(sample_time,'mi')
      ,event
      ,COUNT(1)
  FROM gv$active_session_history
 WHERE sample_time >= to_date('20231010 17:51:00','yyyymmdd hh24:mi:ss')
   AND sample_time <= to_date('20231010 17:54:00','yyyymmdd hh24:mi:ss')
 GROUP BY trunc(sample_time,'mi'), event
 ORDER BY 1;

利用ASH视图分析数据库阻塞问题

时间、事件、源头三段分析法

分析会话阻塞出现的时间段

-- 查看指定时间段内,每分钟等待事件不为空的会话数
SELECT trunc(sample_time,'mi')
      ,event
      ,COUNT(1)
  FROM dba_hist_active_sess_history
 WHERE sample_time > to_date('20231010 17:51:00','yyyymmdd hh24:mi:ss')
   AND sample_time < to_date('20231010 17:54:00','yyyymmdd hh24:mi:ss')
   AND event IS NOT NULL
 GROUP BY trunc(sample_time,'mi'), event
HAVING COUNT(*) > 2
 ORDER BY 1;

分析会话阻塞的等待事件

-- 查看指定时间段内,按照每分钟和等待事件分组,统计数量
SELECT trunc(sample_time,'mi')
      ,event
      ,COUNT(*)
  FROM dba_hist_active_sess_history
 WHERE sample_time > to_date('20231213 17:51:00','yyyymmdd hh24:mi:ss')
   AND sample_time < to_date('20231215 17:54:00','yyyymmdd hh24:mi:ss')
   AND event IS NOT NULL
 GROUP BY trunc(sample_time,'mi'),event
HAVING COUNT(*) > 2
 ORDER BY 1,3;

定位会话阻塞的源头

WITH ash AS
 (SELECT instance_number
        ,session_id
        ,event
        ,blocking_session
        ,program
        ,to_char(sample_time,'YYYYMMDD HH24MISS') sample_time
        ,sample_id
        ,blocking_inst_id
    FROM dba_hist_active_sess_history
   WHERE sample_time > to_date('20231213 17:51:00','yyyymmdd hh24:mi:ss')
     AND sample_time < to_date('20231215 17:54:00','yyyymmdd hh24:mi:ss'))
SELECT *
  FROM (SELECT sample_time
              ,blocking_session final_block
              ,sys_connect_by_path(session_id,',') sid_chain
              ,sys_connect_by_path(event,',') event_chain
          FROM ash
         START WITH session_id IS NOT NULL
        CONNECT BY PRIOR blocking_session = session_id
               AND PRIOR instance_number = blocking_inst_id
               AND sample_id = PRIOR sample_id) a
 WHERE instr(sid_chain ,final_block) = 0
   AND NOT EXISTS (SELECT 1
          FROM ash b
         WHERE a.final_block = b.session_id
           AND b.blocking_session IS NOT NULL)
 ORDER BY sample_time;

实战案例

create or replace procedure p_test_update
as 
 l_cnt number;
begin
  update TEST_ANALYZE set var3='abcd' where id1=920;
  commit;
end; 

update TEST_ANALYZE set var3=‘abcd’ where id1=920;

begin
  p_test_update;
end; 

alter procedure p_test_update compile;

alter procedure p_test_update compile;

按照上面的思路1、2、3逐步排查,找到问题

阻塞问题相对固定的分析思路

时间 > 事件 > 阻塞源 > 源会话分析 > 阻塞关系

利用ASH视图分析SQL运行过程

分析SQL当前所处的阶段

-- gv$active_session_history
IN_PARSE, IN_HARD_PARSE, IN_SQL_EXECUTION, IN_PLSQL_EXECUTION, IN_PLSQL_RPC, IN_PLSQL_COMPILATION, IN_JAVA_EXECUTION, IN_BIND, IN_CURSOR_CLOSE

分析SQL的所属关系

-- gv$active_session_history
SQL_ID, TOP_LEVEL_SQL_ID

分析SQL当前执行的步骤

-- gv$active_session_history
SQL_PLAN_OPERATION, SQL_PLAN_OPTIONS

分析SQL执行计划的变化情况

-- gv$active_session_history
SQL_PLAN_HASH_VALUE

分析SQL当前操作的对象或数据

-- gv$active_session_history
CURRENT_OBJ#, CURRENT_FILE#, CURRENT_BLOCK#, CURRENT_ROW#

实战案例

select * from ANA_TRUSS; 
create index idx_ana_truss_var2 on ana_truss(var2,var1);
insert into ANA_TRUSS select * from ANA_TRUSS;

-- 查询出object_id (CURRENT_OBJ#字段)
SELECT sample_time
      ,sql_id
      ,sql_opname
      ,event
      ,current_obj#
  FROM gv$active_session_history
 WHERE event = 'db file sequential read'
 ORDER BY sample_time DESC;

-- 根据object_id查询具体是哪个对象
select * from dba_objects where object_id=xxx;

ASH视图的其他用途

  • 分析数据库运行性能基线、运行趋势
  • 对比各个不同时间段的活动会话差异
  • 分析跨实例的并行守护进程
  • 分析会话资源消耗情况

参考资料

Oracle活动会话历史(ASH)及报告解读

https://blog.51cto.com/u_14286115/5193824

Oracle性能优化_ASH视图.pptx

标签:视图,event,sample,active,session,time,Oracle,ASH,id
From: https://blog.csdn.net/weixin_tank88921/article/details/140447059

相关文章

  • Oracle数据闪回
    Oracle的闪回功能可以在对数据库进行不完全恢复的情况下,对某一个指定的表进行恢复。闪回数据库是进行时间点恢复的新方法,它能够快速将Oracle恢复到以前的时间,以更正由于逻辑数据损坏或用户错误而引起的问题。当需要恢复时,可以将数据库恢复到错误前的时间点,并且只恢复改变的数......
  • Oracle常见数据块损坏处理方式
    1前提:备份数据库查看数据库的模式SYS@orcl>selectopen_mode,log_modefromv$database;OPEN_MODE LOG_MODE--------------------------------READWRITE ARCHIVELOG修改RMAN的备份参数RMAN>configurecontrolfileautobackupon;newRMANconfigur......
  • iOS开发基础105-Xcode收集Crashs的各种方法
    Xcode提供了一整套工具和功能来帮助开发者收集、分析和处理应用崩溃报告。通过这些工具,开发者可以追踪和解析崩溃日志,以更加准确和及时地修复问题。以下是详细介绍Xcode工具收集崩溃报告的各种方法。一、通过设备获取崩溃报告1.连接设备将iOS设备通过USB连接到您的Mac......
  • 【YashanDB知识库】存储过程报错snapshot too old
    问题描述20231127上午客户反馈绩效系统20231125、20231126出现2次YAS-02020snapshottooold的问题,测试也有类似问题。该过程是客户新增的存储过程,目的是通过PRO_RUN_JOB作为主控,调度其他存储过程,后续不用其他调度引擎。原因分析错误信息收集分析分析存储过程报错日志,核查UN......
  • Oracle数据库概述
    1oracle的数据模式是:用户建在数据库实例上,表建在用户上   不同数据库实例可以建相同的用户;  同一个数据库实例,用户名不能相同;  一个用户可以使用多个表空间;  一个表空间可以被多个用户所使用;  表的权限是和用户绑定的;  表空间不涉及任何权限控制问题; ......
  • HashMap的底层原理
    1.HashMap是       根据关键码值(Keyvalue)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。2.什么是哈希冲突(面试题)        存储数据时,对key值进......
  • 关于hash的面试题
    目录题目1.java里,HashMap的底层实现原理2.如何判断一个HashMap是否已经满了?3.HashSet如何检查重复4.HashSet如何判断一个元素是否已经存在.简单的理解hash题目选自牛客网1.java里,HashMap的底层实现原理数组结构:HashMap使用一个数组来存储元素。哈希函数:通过键......
  • 【YashanDB知识库】数据变化率超过阈值统计信息失效
    【问题分类】性能优化【关键字】统计信息【问题描述】SQL--创建表结构droptablet1;createtablet1(idint,namevarchar2(200));createindext1_id_indont1(id);createindext1_name_indont1(name);--造数beginforiin1..100loopinsertintot1value......
  • 【DG】DataGuard动态性能视图及日志传输/应用服务说明
    一、DataGuard相关动态性能视图 序号 动态性能视图名称 说明1 v$database 查询打开模式,角色,保护模式,保护级别2 v$managed_standby 备库查询进程情况,RFS、MRP03 v$standby_log 查看standbyredolog4 v$archive_dest_statu......
  • oracle 查询锁 && 解锁
    目录oracle查询锁&&解锁查询数据库中的锁查询被锁的对象查询阻塞查询数据库正在等待锁的进程查询会话之间锁等待的关系查询锁等待事件解决方案:oracle查询锁&&解锁查询数据库中的锁select*fromv$lock;select*fromv$lockwhereblock=1;查询被锁的对象select*fr......