等待事件
等待事件概览
* v$event_name:这个视图记录着当前数据库支持的等待事件及其基本信息
* Oracle 的等待事件主要可以分为两类,即空闲(idle)等待事件和非空闲(non-idle)等待事件。
空闲事件指 Oracle 正等待某种工作,在诊断和优化数据库的时候,我们不用过多注意这部分事件。
非空闲等待事件专门针对 Oracle 的活动,指数据库任务或应用运行过程中发生的等待,这些等待事件是我们在调整数据库的时候应该关注与研究的。
等待事件分类
* Oracle 11g R2中主要分类及各类等待事件的个数
SELECT wait_class#, wait_class_id, wait_class, COUNT (*) AS "count"
FROM v$event_name
GROUP BY wait_class#, wait_class_id, wait_class
ORDER BY wait_class#;
WAIT_CLASS# WAIT_CLASS_ID WAIT_CLASS count
----------- ------------- ---------------------------------------------------------------- ----------
0 1893977003 Other 958
1 4217450380 Application 17
2 3290255840 Configuration 24
3 4166625743 Administrative 55
4 3875070507 Concurrency 33
5 3386400367 Commit 2
6 2723168908 Idle 96
7 2000153315 Network 35
8 1740759767 User I/O 48
9 4108307767 System I/O 32
10 2396326234 Scheduler 8
11 3871361733 Cluster 50
12 644977587 Queueing 9
13 rows selected.
SQL>
从等待发现历史瓶颈
* 通过查询 V$SYSTEM_WAIT_CLASS 视图获得各类主要等待事件的等待时间和等待次数等信息,通过分类以及统计信息,可以很直观地快速获得数据库的整体印象。
SQL> set numwidth 30
SQL> select * from v$system_wait_class order by time_waited;
WAIT_CLASS_ID WAIT_CLASS# WAIT_CLASS TOTAL_WAITS TIME_WAITED TOTAL_WAITS_FG TIME_WAITED_FG
------------- ----------- ---------------------------------------------------------------- ----------- ----------- -------------- --------------
2396326234 10 Scheduler 4882 3504 4654 3246
3386400367 5 Commit 5175978 573796 5165499 572165
2000153315 7 Network 777336459 749926 769131912 748125
4217450380 1 Application 4434302 7381881 4397678 7364695
1893977003 0 Other 100729436 17616970 8174372 16305755
1740759767 8 User I/O 6181252645 25640434 6153846672 24928475
3875070507 4 Concurrency 31874404 27587290 31626616 22056683
4166625743 3 Administrative 93480936 55969848 4832 184803
4108307767 9 System I/O 557921472 74836663 77811450 339619
3290255840 2 Configuration 2617482 105558521 2595392 99440746
2723168908 6 Idle 1034274573 1.1087E+11 746393167 3.2167E+10
* 相关视图:
V$SESSION(V$SESSION_WAIT):会话当前正在发生的事件
V$SESSION_EVENT :活动会话在其生命周期经历的事件(对V$SESSION的累积)
V$SYSTEM_EVENT :作为数据库整体等待事件保存(对V$SESSION_EVENT的累积)
注意,V$SESSION_EVENT 或者 V$SYSTEM_EVENT 视图的累积信息以及关于等待的平均计算,使我们无法得知个别等待消耗的时间长短。为了解决这一问题,Oracle 10g 引入了一个新的视图 v$event_histogram,通过这个视图可
以看到等待事件的柱状图分布,从而可以对一个等待事件的具体分布有进一步的了解。在以下查询输出中可以看到,cursor: pin S wait on X 的竞争主要是 16至512 毫秒的竞争。但是注意等
待时间在 4096 毫秒左右的等待也有 2 次。
SQL> set numwidth 30
SQL> SELECT event, wait_time_milli, wait_count
2 FROM v$event_histogram WHERE event = 'cursor: pin S wait on X';
EVENT WAIT_TIME_MILLI WAIT_COUNT
---------------------------------------------------------------- ------------------------------ ------------------------------
cursor: pin S wait on X 1 23116
cursor: pin S wait on X 2 14786
cursor: pin S wait on X 4 28929
cursor: pin S wait on X 8 55937
cursor: pin S wait on X 16 59049323576
cursor: pin S wait on X 32 440755320
cursor: pin S wait on X 64 8417963
cursor: pin S wait on X 128 4674251
cursor: pin S wait on X 256 13744
cursor: pin S wait on X 512 379
cursor: pin S wait on X 1024 27
cursor: pin S wait on X 2048 0
cursor: pin S wait on X 4096 2
13 rows selected.
SQL>
从等待确定当前瓶颈
* ASH
* 确定当前主要影响性能的等待事件
col event format a30
col p1text format a20
select sid,event,p1,p1text from v$session where event not like '%client%';
* 捕获相关sql
spool /home/oracle/sqltext.txt
select sql_text from v$sqltext a
where a.hash_value = (select sql_hash_value from v$session b where b.event = '通过上条SQL获取等待事件')
order by piece asc;
spool off