1、模拟一个会话阻塞的场景。
   通过update 同一行数据达到模拟阻塞的效果 :

SQL> create table t1 (id number ,name varchar2(20)) ;
SQL> insert into t1 values(1,'huyi') ;
已创建 1 行。
SQL> insert into t1 values(2,'zhanges');
已创建 1 行。 SQL> select * from scott.t1 ; ID NAME
---------- --------------------
1 huyi
2 zhanges
SQL> update scott.t1 set name='huyi2' where id=1; 已更新 1 行。 注意:未提交 新开一个窗口:
ora11g-> sqlplus "/ as sysdba" SQL*Plus: Release 11.2.0.4.0 Production on 星期五 10月 19 08:16:26 2018 Copyright (c) 1982, 2013, Oracle. All rights reserved. 连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> update scott.t1 set name='huyi3' where id=1; 产生等待
33
 
1
SQL> create table t1 (id number ,name varchar2(20)) ; 
2
SQL> insert into t1 values(1,'huyi') ;
3
已创建 1 行。
4
SQL> insert into t1 values(2,'zhanges');
5
已创建 1 行。
6

7

8
SQL> select * from scott.t1 ;
9

10
        ID NAME
11
---------- --------------------
12
         1 huyi
13
         2 zhanges
14
SQL>  update  scott.t1 set name='huyi2'  where id=1; 
15

16
已更新 1 行。
17

18
注意:未提交         
19
         
20
新开一个窗口:
21
ora11g-> sqlplus "/ as sysdba"
22

23
SQL*Plus: Release 11.2.0.4.0 Production on 星期五 10月 19 08:16:26 2018
24

25
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
26

27
连接到: 
28
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
29
With the Partitioning, OLAP, Data Mining and Real Application Testing options
30

31
SQL>  update  scott.t1 set name='huyi3'  where id=1;   产生等待
32

33

2、利用ASH视图分析,定位到阻塞源会话,并解除阻塞。
      分思路:1.找到某个大至时间范围 即:什么时间
                      2.找到这个时间段的等待事件:产生原因 
                      3.找到是谁导致了阻塞 : 阻塞源
                      4.源会话分析 
                      5.阻塞关系分析
SQL> alter session set NLS_DATE_FORMAT='YYYYMMDD HH24:MI:SS'  ;
会话已更改。 1.找到某个大至时间范围 即:什么时间
SQL> select trunc(sample_time,'mi'),count(1) from gv$active_session_history group by trunc(sample_time,'mi') order by 1 ;
TRUNC(SAMPLE_TIME COUNT(1)
----------------- ---------- 20181019 07:56:00 1
20181019 07:57:00 3
20181019 07:58:00 1
20181019 08:00:00 3
20181019 08:01:00 1
20181019 08:03:00 1
20181019 08:06:00 2
20181019 08:09:00 3
20181019 08:11:00 2
20181019 08:13:00 1
20181019 08:15:00 2
20181019 08:17:00 59 #这里等待时事明显突然增多
20181019 08:18:00 64
20181019 08:19:00 63
20181019 08:20:00 60
20181019 08:21:00 62
20181019 08:22:00 60
20181019 08:23:00 60
20181019 08:24:00 61
20181019 08:25:00 60
20181019 08:26:00 61
20181019 08:27:00 62 2. 找出某个等待事件 : SQL> select trunc(sample_time,'mi'),event,count(1) from gv$active_session_history
2 where
3 sample_time >=to_date('20181019 08:14:00','yyyymmdd hh24:mi:ss')
4 and sample_time <=to_date('20181019 08:18:00','yyyymmdd hh24:mi:ss')
5 group by trunc(sample_time,'mi') ,event order by 1 ; TRUNC(SAMPLE_TIME EVENT COUNT(1)
----------------- ----------------------------------- ----------
20181019 08:15:00 1
20181019 08:15:00 log file parallel write 1
20181019 08:17:00 enq: TX - row lock contention 59 #根据时间范围找出等待事件 3. 找出会话源头: col sample_time for a20
col final_block for 99999999
col sid_chain for a15
col event_chain for a35 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('20181019 08:14:00','yyyymmdd hh24:mi:ss')
and sample_time <to_date('20181019 08:18: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 ; SAMPLE_TIME FINAL_BLOCK SID_CHAIN EVENT_CHAIN
-------------------- ----------- --------------- -----------------------------------
20181019 081703 129 ,130 ,enq: TX - row lock contention #从这里可以看出是sid 129 阻赛了130
20181019 081713 129 ,130 ,enq: TX - row lock contention
20181019 081723 129 ,130 ,enq: TX - row lock contention
20181019 081733 129 ,130 ,enq: TX - row lock contention
20181019 081743 129 ,130 ,enq: TX - row lock contention
20181019 081753 129 ,130 ,enq: TX - row lock contention 已选择6行。 4.源会话分析
找出某个SQL引起的等待事件
select event,sql_id,count(1) from gv$active_session_history a where a.sample_time > sysdate -15/144 group by event,sql_id order by count(1) desc ; EVENT SQL_ID COUNT(1)
----------------------------------- --------------- ----------
enq: TX - row lock contention gw47xzmm9h6qq 5921
control file parallel write 34
log file parallel write 5
os thread startup 2
db file sequential read fsk02m4793dqq 1
null event 3ktacv9r56b51 1
dayq182sk41ks 1
f318xdxdn0pdc 1
null event 1
5d2u345mmudn9 1
1np800rjbv1kn 1 5.查询会话状态  set linesize 2000
set pagesize 2000
col ins_sid for a15
col username for a10
col machine for a10
col program for a26
col module for a26
col action for a10
col sql_id for a15
col event for a25
col blocking_session for 999999999
col logon_time for a26
col prev_exec_start for a10
col client_info for a10 select inst_id||','||sid ins_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; INS_SID USERNAME MACHINE PROGRAM MODULE ACTION SQL_ID EVENT BLOCKING_SESSION LOGON_TIME PREV_EXEC_ CLIENT_INF
----------- ------ ---------- -------------------------- -------------------------- ------ --------------- ------------------------- ------------ -------------------- ---------- ----------
1,8 SYS ora11g sqlplus@ora11g (TNS V1-V3) sqlplus@ora11g (TNS V1-V3) c3wctdc71swjh SQL*Net message to client 20181019 08:24:18 20181019 0
9:49:55 1,70 ora11g oracle@ora11g (J000) jobq slave wait 20181019 09:49:46
1,130 SYS ora11g sqlplus@ora11g (TNS V1-V3) sqlplus@ora11g (TNS V1-V3) gw47xzmm9h6qq enq: TX - row lock conten 129 20181019 08:16:26 20181019 0
tion 8:16:26 1,131 ora11g oracle@ora11g (J001) jobq slave wait 20181019 09:49:46 查询被阻塞的SQL语句:
select SQL_ID,sql_text from v$sqltext where SQL_ID='&sql_id' order by piece asc;
SQL_ID SQL_TEXT
--------------- ----------------------------------------------------------------------------------------------------
gw47xzmm9h6qq update scott.t1 set name='huyi3' where id=1; 查询阻塞的SQL语句:
set linesize 1000
select /*+ ORDERED USE_NL(st) */ INST_ID,SQL_ID,sql_text from gv$sqltext a
where (a.hash_value, a.address) IN (
SELECT DECODE (sql_hash_value,0, prev_hash_value,sql_hash_value),
DECODE (sql_hash_value, 0,prev_sql_addr, sql_address)
from gv$session where sid=&sid and INST_ID=INST_ID ) order by piece asc;
输入 sid 的值: 129
原值 5: from gv$session where sid=&sid and INST_ID=INST_ID ) order by piece asc
新值 5: from gv$session where sid=129 and INST_ID=INST_ID ) order by piece asc INST_ID SQL_ID SQL_TEXT
---------- --------------- ----------------------------------------------------------------------------------------------------
1 4f0caa4cy9x8v update scott.t1 set name='huyi2' where id=1 #可以看出:是由于会话129 更新了一条数据,未提交,导到了另一个会话更新相同数据时被阻塞。
# 总结:1.出现类似问题思路清晰,找到时间段,是什么原因,出现什么问题 ,理清问题关系
#     2.要深度了解gv$active_session_history 的数据源,以及各字段的含义,以方便我们能没在有工具的情况下,编写出我们需要的脚本。 历史等待事件状态:
set linesize 2000
set pagesize 2000
col event for a35 select event,count(1) from gv$active_session_history a where a.sample_time > sysdate -15/144 group by event order by count(1) desc ;
EVENT COUNT(1)
----------------------------------- ----------
enq: TX - row lock contention 5871
71
control file parallel write 34
log file parallel write 5
null event 2
os thread startup 2
db file sequential read 1 已选择7行。
173
 
1
SQL> alter session set NLS_DATE_FORMAT='YYYYMMDD HH24:MI:SS'  ;
2
会话已更改。
3

4
1.找到某个大至时间范围 即:什么时间
5
SQL> select trunc(sample_time,'mi'),count(1) from gv$active_session_history group by trunc(sample_time,'mi') order by 1 ;
6
TRUNC(SAMPLE_TIME   COUNT(1)
7
----------------- ----------
8

9
20181019 07:56:00 1
10
20181019 07:57:00 3
11
20181019 07:58:00 1
12
20181019 08:00:00 3
13
20181019 08:01:00 1
14
20181019 08:03:00 1
15
20181019 08:06:00 2
16
20181019 08:09:00 3
17
20181019 08:11:00 2
18
20181019 08:13:00 1
19
20181019 08:15:00 2
20
20181019 08:17:00 59  #这里等待时事明显突然增多   
21
20181019 08:18:00 64
22
20181019 08:19:00 63
23
20181019 08:20:00 60
24
20181019 08:21:00 62
25
20181019 08:22:00 60
26
20181019 08:23:00 60
27
20181019 08:24:00 61
28
20181019 08:25:00 60
29
20181019 08:26:00 61
30
20181019 08:27:00 62
31

32
2. 找出某个等待事件 :
33

34
SQL> select trunc(sample_time,'mi'),event,count(1) from  gv$active_session_history 
35
  2  where 
36
  3   sample_time >=to_date('20181019 08:14:00','yyyymmdd hh24:mi:ss')
37
  4   and  sample_time <=to_date('20181019 08:18:00','yyyymmdd hh24:mi:ss')
38
  5   group by  trunc(sample_time,'mi') ,event order by 1 ;  
39

40
TRUNC(SAMPLE_TIME EVENT                                 COUNT(1)
41
----------------- ----------------------------------- ----------
42
20181019 08:15:00                                              1
43
20181019 08:15:00 log file parallel write                      1
分析思路:


01 性能优化基础怀实践 之 ASH分析的更多相关文章

  1. Spark实践 -- 性能优化基础

    性能调优相关的原理讲解.经验总结: 掌握一整套Spark企业级性能调优解决方案:而不只是简单的一些性能调优技巧. 针对写好的spark作业,实施一整套数据倾斜解决方案:实际经验中积累的数据倾斜现象的表 ...

  2. Oracle数据库性能优化基础

    1.数据处理分类OLTP,OLAP 2.Oracle特性 3.数据库优化方法论/原则 方法论:自顶向下优化和自底向上优化 3.1 自顶向下优化 3.2 自底向上优化 对于多年的老系统出现性能问题时,就 ...

  3. React性能优化之PureComponent 和 memo使用分析

    前言 关于react性能优化,在react 16这个版本,官方推出fiber,在框架层面优化了react性能上面的问题.由于这个太过于庞大,我们今天围绕子自组件更新策略,从两个及其微小的方面来谈rea ...

  4. 读<jquery 权威指南>[7]-性能优化与最佳实践

    一.优化选择器执行速度 1. 优先使用ID选择器和标记选择器 使用选择器时应该首选ID选择器($("#id")),其次是标记选择器($("div")),最后再选 ...

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

    ASH和AWR的关系 ASH以V$SESSION为基础,每秒採样一次,记录活动会话等待的事件.不活动的会话不会採样,採样工作由新引入的后台进程MMNL来完毕. ASH内存记录数据始终是有限的,为了保存 ...

  6. linux性能优化基础——iommu相关配置

    此篇文档介绍了IOMMU相关的信息: https://blog.chaosjohn.com/Check-VT-D-or-IOMMU-under-Linux.html iommu和vt-d都是io半虚拟 ...

  7. PLSQL_性能优化系列12_Oracle Index Anaylsis索引分析

    2014-10-04 Created By BaoXinjian

  8. Mysql系列-性能优化神器EXPLAIN使用介绍及分析

    MySQL 提供了一个 EXPLAIN 命令, 它可以对 SELECT 语句进行分析, 并输出 SELECT 执行的详细信息, 以供开发人员针对性优化. EXPLAIN 命令用法十分简单, 在 SEL ...

  9. Java 性能优化实战记录(1)---定位并分析耗cpu最多的线程

    1) jps    列出相关的java进程, 以及对应的pid    也可以使用如下命令来尝试    ps aux | grep java --color 2) top -Hp <pid> ...

随机推荐

  1. Qt中显示图像的两种方法

    博客转载自:https://blog.csdn.net/lg1259156776/article/details/52325361 在Qt中处理图片一般都要用到QImage类,但是QImage的对象不 ...

  2. poj1769 Minimizing maximizer

    传送门 题目大意 给你m个机器,n个数,每个机器可以给n个数的某一段排序,求最少使用几个机器,保证可以把这个n个数排好序 分析 我们可以想到dpij表示考虑前i个机器让最大的数到达点j至少需要使用多少 ...

  3. Luogu 4310 绝世好题

    BZOJ 4300 先把这堆东西丢到博客里,以后再复习. 首先考虑暴力的$dp$,设$f_i$表示以$i$结尾的满足条件的序列的最长长度,有: $f_i = max(f_j) + 1$    $j & ...

  4. Qemu虚拟机 玩树莓派最新版系统 (截止2017-04-10)

    Qemu虚拟机可以玩 树莓派,大家都知道了吧.可是网上的教程好老,都是2012年的.我按照教程下载了最新版版本的树莓派系统怎么也跑不起来. 研究了好久,终于找到一个简单的方法,特意分享出来.转载请注意 ...

  5. android smali代码注入 实战一

    有同学在通服里面干活,最近一直忙着4g基站搭建的干活,测试设备(android)测量移动网络数据,没有自动保存记录的功能,只能手动记录各种测试参数,不知道测试软件供应商是怎样想的,竟然不提供的这样的功 ...

  6. Android wifi管理类:WifiAdmin

    1.wifi的五种状态: WIFI_STATE_DISABLED   WIFI网卡不可用 WIFI_STATE_DISABLING WIFI网卡正在关闭 WIFI_STATE_ENABLED     ...

  7. Django之视图与模板以及在模板中使用bootstrap

    从url中也可以传递参数给后台进行处理.比如http://127.0.0.1:8001/add/?a=4&b=5. 这个链接传入a=4,b=5.后台将进行a+b的处理 新增处理函数 def a ...

  8. ubuntu - 14.04,如何操作Gnome的任务栏?

    搜索到的答案: in gnome classic you must press both the Alt & Super keys at the same time while right-c ...

  9. iOS开发:setNeedsLayOut和setNeedsDisplay区别

    1.layoutSubviews方法 1.1 根据苹果官方帮助文档对layoutSubviews方法的解释: 此方法用来重新定义子元素的位置和大小.当子类重写此方法,用来实现UI元素的更精确布局.如果 ...

  10. server12装.NET 3.5

    参考:https://support.microsoft.com/en-us/help/2734782/net-framework-3-5-installation-error-0x800f0906- ...