Oracle等待事件详解
个人分类:体系结构篇
一.等待事件的相关知识:
1.1 等待事件主要可以分为两类:即空闲(IDLE)等待事件和非空闲(NON-I DLE)等待事件。
1). 空闲等待事件指ORAC LE正等待某种工作,在诊断和优化数据库的时候,不用过多注意这部分事件。
2).非空闲等待事件专门针对ORAC LE的活动,指数据库任务或应用运行过程中发生的等待,这些等待事件是在调整数据库的时候需要关注与研究的。
在Or acle10g中的等待事件有872个,11g中等待事件1116个。我们可以通过
v$ev ent_n ame 视图来查看等待事件的相关信息。
1.2查看v$e vent_name视图的字段结构:
SQ L> de sc v$event_name;
名称是否为空?类型
----------------------------------------- -----------------------
EVE NT# NU MBER
EVEN T_ID NUM BER
NAME VARC HAR2(64)
PARAM ETER1 VARC HAR2(64)
PARAM ETER2 VARC HAR2(64)
PARAM ETER3 VARC HAR2(64)
WAIT_CLASS_ID NUMB ER
W AIT_C LASS#NUMBE R
WA IT_CL ASS V ARCHA R2(64)
1.3 查看等待事件总数:
SQL> sel ect c ount(*) fr om v$event_name;
C OUNT(*)
----------
1116
1.4查看等待事件分类情况:
/*Forma ttedon 2010/8/11 16:08:55 (QP5 v5.115.810.9015) */
SEL ECT wait_class#,
wait_clas s_id,
w ait_c lass,
C OUNT( * ) AS "count"
FRO M v$eve nt_na me
GR OUP B Y w ait_c lass#, wai t_cla ss_id, wai t_cla ss
OR DER B Y w ait_c lass#;
WAI T_CLA SS# W AIT_C LASS_ID WA IT_CL ASS c ount
----------- ------------- -------------------- ----------
0 1893977003 O ther 717
1 4217450380 App licat ion 17
23290255840Confi gurat ion 24
3 4166625743 Ad minis trati ve 54
4 3875070507 Conc urren cy 32
5 3386400367 C ommit2
6 2723168908 Idl e 94
72000153315Netwo rk 35
8 1740759767 Us er I/O 45
9 4108307767 Syst em I/O 30
10 2396326234 S chedu ler 7
11 3871361733 Clu ster 50
12644977587 Q ueuei ng 9
1.5相关的几个视图:
V$SES SION:代表数据库活动的开始,视为源起。
V$SESS ION_W AIT:视图用以实时记录活动SESS ION的等待情况,是当前信
息。
V$SE SSION_WAIT_HIST ORY:是对V$SESSI ON_WA IT的简单增强,记录活动SES SION的最近10次等待。
V$SQLT EXT:当数据库出现瓶颈时,通常可以从V$SE SSION_WAIT到那些正在等待资源的SESS ION,通过SESS ION的S ID,联合V$SES SION和
V$SQL TEXT视图就可以捕获这些SE SSION正在执行的SQL语句。
V$A CTIVE_SESS ION_H ISTOR Y: 是A SH的核心,用以记录活动SES SION的历史等待信息,每秒采样一次,这部分内容记录在内存中,期望值是记录一个小时的内容。
WRH#_ACTI VE_SE SSION_HIST ORY :是V$A CTIVE_SESS ION_H ISTOR Y在
AWR的存储地。
V$AC TIVE_SESSI ON_HI STORY: 中的信息会被定期(每小时一次)的刷新到负载库中,并缺省保留一个星期用于分析。
DBA_HIST_ACTIV E_SES S_HIS TORY:视图
是W RH#_A CTIVE_SESS ION_H ISTOR Y视图和其他几个视图的联合展现,通常通过这个视图进行历史数据的访问。
V$SYS TEM_E VENT由于V$S ESSIO N记录的是动态信息,和SESS ION的生命周期相关,而并不记录历史信息,所以OR ACLE提供视图V$SYSTE M_EVE NT来记录数据库自启动以来所有等待事件的汇总信息。通过这个视图,用户可以迅速获得数据库运行的总体概况。
二. 33个常见的等待事件
1. Buff er bu sy wa its
从本质上讲,这个等待事件的产生仅说明了一个会话在等待一个Buf fer(数据块),但是导致这个现象的原因却有很多种。常见的两种是:
当一个会话视图修改一个数据块,但这个数据块正在被另一个会话修改时。
421事件是什么当一个会话需要读取一个数据块,但这个数据块正在被另一个会话读取到内存中时。
Orac le 操作的最小单位是块(Bl ock),即使你要修改一条记录,也需要对这条记录所在的这个数据块做操作。当你对这个数据块做修改时,其他的会话将被阻止对这个数据块上的数据做修改(即使其他用
户修改的不是当前用户修改的数据),但是可以以一致性的方式读取这个数据块(f rom u ndo)。当前的用户修改完这个数据块后,将会立即释放掉加在这个数据块上的排他锁,这样另一个会话就可以继续修改它。修改操作是一个非常短暂的时间,这种加锁的机制我们叫Lat ch。
当一个会话修改一个数据块时,是按照以下步骤来完成的:
以排他的方式获得这个数据块(Latch)
修改这个数据块。
释放La tch。
Buffe r bus y wai ts等待事件常见于数据库中存在的热快的时候,当多个用户频繁地读取或者修改同样的数据块时,这个等待事件就会产生。如果等待的时间很长,我们在AW R或者st atspa ck 报告中就可以看到。
这个等待事件有三个参数。查看有几个参数我们可以用以下SQL:
SQL>selec t nam e, pa ramet er1,param eter2, par amete r3 fr om v$event_name wher e
nam e='bu fferbusywaits';
NA ME PARA METER1 PA RAMET ER2 PARAM ETER3
-------------------- ---------- ---------- ----------
b uffer busy wait s file# bloc k# cla ss#
在下面的示例中,查询的方法和这个一样,所以其他事件对参数的查询将不做过多的说明。
File#: 等待访问数据块所在的文件i d号。
B locks:等待访问的数据块号。
ID:在10g之前,这个值表示一个等待时间的原因,10g之后则表示等待事件的类别。
2. B uffer lat ch
内存中数据块的存放位置是记录在一个hash列表(cac he bu fferchain s)当中的。
当一个会话需要访问某个数据块时,它首先要搜索这个hash列表,从列表中获得数据块的地址,然后通过这个地址去访问需要的数据块,这个列表O racle会使用一个latch来保护它的完整性。当一个会话需要访问这个列表时,需要获取一个
Latc h,只有这样,才能保证这个列表在这个会话的浏览当中不会发生变化。
产生buffe r lat ch的等待事件的主要原因是:
Buffe r cha ins太长,导致会话搜索这个列表花费的时间太长,使其他的会话处于等待状态。
同样的数据块被频繁访问,就是我们通常说的热快问题。
产生buff er ch ains太长,我们可以使用多个buffe r poo l的方式来创建更多的buffe r cha ins,或者使用参数DB_BL OCK_L RU_LA TCHES来增加la tch的数量,以便于更多的会话可以获得l atch,这两种方法可以同时使用。
这个等待事件有两个参数:
Latc h add r:会话申请的la tch在S GA中的虚拟地址,通过以下的S QL语句可以根据这个地址到它对应的La tch名称:
sel ect * from v$la tch a,v$la tchna me bwhere
addr=latc h add r -- 这里的latch addr是你从等待事件中看到的值
and a.latc h#=b.latch#;
c hain#: buf fer c hains hash列表中的索引值,当这个参数的值等于s0xfff ffff时,说明当前的会话正在等待一个L RU la tch。
3. Contr ol fi le pa ralle l wri te
当数据库中有多个控制文件的拷贝时,Oracl e 需要保证信息同步地写到各个控制文件当中,这是一个并行的物理操作过程,因为称为控制文件并行写,当发生这样的操作时,就会产生con trolfileparal lel w rite等待事件。
控制文件频繁写入的原因很多,比如:
日志切换太过频繁,导致控制文件信息相应地需要频繁更新。
系统I/O 出现瓶颈,导致所有I/O出现等待。
当系统出现日志切换过于频繁的情形时,可以考虑适当地增大日志文件的大小来降低日志切换频率。
当系统出现大量的co ntrol file para llelwrite等待事件时,可以通过比如降低控制文件的拷贝数量,将控制文件的拷贝存放在不同的物理磁盘上的方式来缓解I/O 争用。
这个等待事件包含三个参数:
Fil es:O racle要写入的控制文件个数。
Bl ocks:写入控制文件的数据块数目。
Reque sts:写入控制请求的I/O次数。
4. C ontro l fil e seq uenti al re ad
当数据库需要读取控制文件上的信息时,会出现这个等待事件,因为控制文件的信息是顺序写的,所以读取的时候也是顺序的,因此称为控制文件顺序读,它经常发生在以下情况:
备份控制文件
RAC 环境下不同实例之间控制文件的信息共享
读取控制文件的文件头信息
读取控制文件其他信息
这个等待事件有三个参数:
File#:要读取信息的控制文件的文件号。
Blo ck#:读取控制文件信息的起始数据块号。
Blo cks:需要读取的控制文件数据块数目。
5. Db fi le pa ralle l rea d
这是一个很容易引起误导的等待事件,实际上这个等待事件和并行操作(比如并行查询,并行DM L)没有关系。这个事件发生在数据库恢复的时候,当有一些数据
块需要恢复的时候,O racle会以并行的方式把他们从数据文件中读入到内存中进行恢复操作。
这个等待事件包含三个参数:
F iles:操作需要读取的文件个数。
B locks:操作需要读取的数据块个数。
Requ ests:操作需要执行的I/O次数。
6. D b fil e par allel writ e
这是一个后台等待事件,它同样和用户的并行操作没有关系,它是由后台进程DBWR产生的,当后台进程D BWR想磁盘上写入脏数据时,会发生这个等待。
DB WR会批量地将脏数据并行地写入到磁盘上相应的数据文件中,在这个批次作业完成之前,DBWR将出现这个等待事件。如果仅仅是这一个等待事件,对用户的操作并没有太大的影响,当伴随着出现f ree b uffer wait s等待事件时,说明此时内存中可用的空间不足,这时候会影响到用户的操作,比如影响到用户将脏数据块读入到内存中。
当出现db file para llelwrite等待事件时,可以通过启用操作系统的异步I/O的方式
来缓解这个等待。当使用异步I/O时,D BWR不在需要一直等到所有数据块全部写入到磁盘上,它只需要等到这个数据写入到一个百分比之后,就可以继续进行后续的操作。
这个等待事件有两个参数:
Re quest s:操作需要执行的I/O次数。
Tim eouts:等待的超时时间。
7. Db fi le sc atter ed re ad
这个等待事件在实际生产库中经常可以看到,这是一个用户操作引起的等待事件,当用户发出每次I/O需要读取多个数据块这样的SQL操作时,会产生这个等待事件,最常见的两种情况是全表扫描(FT S: Fu ll Ta ble S can)和索引快速扫描
(IFF S: in dex f ast f ull s can)。
这个名称中的sca ttere d( 发散),可能会导致很多人认为它是以scatt ered的方式来读取数据块的,其实恰恰相反,当发生这种等待事件时,S QL的操作都是顺序地读
取数据块的,比如F TS或者I FFS方式(如果忽略需要读取的数据块已经存在内存中的情况)。
这里的s catte red指的是读取的数据块在内存中的存放方式,他们被读取到内存中后,是以分散的方式存在在内存中,而不是连续的。
这个等待事件有三个参数:
Fi le#:要读取的数据块所在数据文件的文件号。
B lock#:要读取的起始数据块号。
B locks:需要读取的数据块数目。
8. Db file sequ entia l rea d
这个等待事件在实际生产库也很常见,当Oracl e 需要每次I/O只读取单个数据块这样的操作时,会产生这个等待事件。最常见的情况有索引的访问(除I FFS外的方
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论