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. Windows Live Writer 使用指南

    一.简介 Windows Live Writer 是一个强大的离线博客编辑工具,通过它可以离线编辑内容丰富的博文,除了自身强大的编辑功能之外,还提供了接口,让其它开发人员通过插件提供工具自身没有提供的 ...

  2. 网络笔记-unity 实现AOP

    该文章来自网络,如有冒犯,请及时联系! 前提 引用以下文件 Microsoft.Practices.ObjectBuilder2.dll Microsoft.Practices.Unity.dll M ...

  3. 数据结构--树--AVL树

    详情查看:http://www.cnblogs.com/skywang12345/p/3577360.html

  4. java求几个数字的和输出详细步骤

    设计思想:要求几个数字的和,就要把输入的字符串转换成浮点型,然后求和再输出. 程序流程图: 程序源代码: //此程序用于从命令行接收多个数字,就和并输出. //作者:赵东睿 //2015.9.26 p ...

  5. 用create table 命令建立表

    create table [[V.]HANKE.].MADE IN HOME (xuliehao int primary key, name varchar(20)not null, jiage fl ...

  6. 从零开始搭建.NET Core 2.0 API(学习笔记一)

    从零开始搭建.NET Core 2.0 API(学习笔记一) 一. VS 2017 新建一个项目 选择ASP.NET Core Web应用程序,再选择Web API,选择ASP.NET Core 2. ...

  7. ubuntu - 14.04,解决Gnome桌面右键菜单失效问题!

    我安装完ubuntu14.04,首先安装经典版的Gnome,刚安装完经典版的Gnome,在桌面点击鼠标右键会弹出菜单,使用非常方便,但是当我安装了最新版的Gnome15.10之后,我发现再进入经典版的 ...

  8. OC 语言新特性

    前言 相对于 Java,OC 语言是一门古老的语言了,而它又是一门不断发展完善的语言.一些新的编译特性,为 OC 语言带来了许多新的活力. 在 Xcode7 中,iOS9 的 SDK 已经全面兼容了 ...

  9. Vim编辑器的学习

    在老师的带领下,最近也算是涨了见识.自己安装并尝试着体验了Vim的一些基本功能,可能是作为初学者,总感觉其指令太过复杂,就文本编辑而言,给我的最大感受就是神而乎之,一头雾水.目前我对这款编译器的掌握水 ...

  10. KDevelop4调试pcl一直读取不到.pcd文件

    如题所示,KD下,能编译,运行时一直使用reader.read读取不到pcd,但是使用cmake能正常运行. 后来,使用terminator删掉工程的build文件夹,直接在工程文件下进行编译,报错提 ...