您的位置:首页 > 大数据 > 人工智能

Common Wait Events(读书总结)

2013-09-28 20:21 253 查看

单实例等待事件

01 buffer busy waits 等待事件

当会话要访问缓冲存储中的数据块,而该数据块正在被其他会话使用时将产生buffer busy waits事件。其他会话可能正在从数据文件中向缓冲存储器读取同样的数据块,或者正在缓冲存储器中对其修改。

为了保证数据的一致性,正在修改该数据块的会话会在其标题中标记一个标志,让其他的会话知道有一个更改正在进行,而等候更改的完成。

在10g中,还有一个时间buffer busy,不要将这个事件和buffer busy waits想混淆,当会话在一个使用ASM的数据库中访问高速缓存的元数据是,提交buffer
busy事件。

视图v$waitstat不是OWI的组件,但是为每一类缓冲区提供了有用的等待统计,遭遇buffer
busy等待时间最常见的缓冲区类为数据块,段头,撤销块,撤销头。

以下是在一个rac库中的查询

15:49:23 RAC3 sql>select * from v$waitstat;

CLASS COUNT TIME

------------------ ---------- ----------

data block 212 762

sort block 0 0

save undo block 0 0

segment header 5 0

save undo header 0 0

free list 0 0

extent map 0 0

1st level bmb 4 0

2nd level bmb 2 0

3rd level bmb 0 0

bitmap block 0 0

CLASS COUNT TIME

------------------ ---------- ----------

bitmap index block 0 0

file header block 20 9

unused 0 0

system undo header 0 0

system undo block 0 0

undo header 3720 15

undo block 51 0

18 rows selected.

buffer busy wait的等待参数描述如下:

P1:显示询问的数据库驻留的绝对文件号

P2:进程需要访问的实际块号。

P3:在10g中P3指的是v$waitclass视图中的类。

等待时间

100厘秒或者是1秒

Table 3-1: buffer busy waits Reason Codes
Reason Code
Description
100 (1003)
The blocking session is reading the block into cache, most likely the undo block for rollback; the waiting session wants exclusive access to create a new block for this information.

造成阻塞的会话正在将块读入高速缓存,最有可能的原因是回滚撤销块。等待的会话想以独占的方式为此信息创建一个新块。
110 (1014)
The blocked or waiting session wants to access the current image of the block in either shared (to read) or exclusive (to write) mode, but the blocking session is reading the block into cache.

被阻塞或等待的会话以共享(读)或独占(写)模式访问该块的当前映像。而此时造成阻塞的会话正在将块读入高速缓存。
120 (1014)
The blocked session wants to access the block in current mode; the blocking session is reading the block in the cache. This happens during buffer lookups.
被阻塞的会话想以当前模式访问块,造成阻塞的会话正在读取cache中的块,该事件在缓冲区查找期间发生。
130 (1013)
One or more sessions want to access the same block, but it is not in the buffer. One session will perform the I/O operation and post either a
db file sequential read or a db file scattered read event, while the waiting sessions will post
buffer busy waits with this reason code.
一个活多个会话想访问同一个块,但该块不在缓冲区。一个会话将执行IO操作,提交db file sequential read or a
db file scattered read 事件而此时等待的会话将以该原因码提交buffer busy waits事件
200 (1007)
The blocking session is modifying the block in the cache; the waiting session wants exclusive access to create a new block.
210 (1016)
The blocking session is modifying the block, while the blocked session wants the current version of the block in exclusive mode. This happens when two processes want to update the same block.
220 (1016)
The blocking session is modifying the block, while the blocked session wants to access the block in current mode during buffer lookup.
230 (1010)
The blocking session is modifying the block, while the blocked session wants shared access of a coherent version of the block.
231 (1012)
The blocking session is modifying the block, while the blocked session is the reading current version of the block when shared access of a coherent version of the block was wanted.
等待时间:

完成所有的IO请求锁耗费的市级时间。

02 control file parallel write事件

当会话在等待所有控制文件的写入完成时产生control file parallel write事件。服务器进程并行处理这些请求。

如果存在control file parallel write事件,如果等待时间的系统等待显著,则说明不是有大量的对控制文件的写入,就是写入控制文件的性能缓慢

等待参数

P1:要写入的绝对文件号码

P2:从中写入的起始块号

P3:要写入的块数

该等待事件反映了大量的控制文件写入,或者是控制文件在并行写入的时候,存在性能缓慢的问题。

03 db file parallel read 等待事件

db file parallel read
事件并不与任何并行操作相关,既不是并行DML,也不是并行查询。

在进行数据库恢复操作期间,当作为恢复的一部分而需要更改数据块从数据文件中并行读取时产生的该事件。当一个进程从一个或者多个数据文件读取多个非连续的单独数据块时产生该事件。

等待参数

P1:读取文件的号码

P2:读取块的总数

P3:IO请求的总数(自“多块读取”不再使用后该参数同P2)

等待时间:

无超时,会话一直等到所有的IO操作完成。

从数据文件中并行读取数据块的时候产生的等待事件。主要是进程第一个或者多个数据文件中读取多个非连续的单独的数据块时产生(是为了读取非连续的数据块)

04 db file parallel write等待事件

db file parallel write
事件不与任何并行的DML操作相关。

该事件属于DBWR进程

阻塞者是OS IO子系统,这也会对IO子系统造成影响。

因为写入操作可能会影响从同一磁盘进行读取操作的会话的读取时间。

DBWR将一组脏数据块译成写入批量。它发布多个IO请求将“写入批量”写入数据文件。然后此事件等待直到IO请求都完成。但是当使用异步IO时,DBWR不等待整个批量写入的完成。在将空闲缓冲区退回到LRU链以使其可用之前,仅等待一定百分比的批量处理掉完成,它也可能发布多个写入请求。

等待参数:

P1:写入文件的号码

P2:写入块的总数

P3:以厘秒为单位显示等待IO完成的超时值。(9.2i以后)

等待时间:

无超时,会话一直等到所有的IO操作完成。

05 db file scattered read 等待事件

当会话发布一个读入多个数据块的IO请求时提交db file scattered
read(数据文件离散读取)事件。

从数据文件读取的块离散的进入缓存中。

该时间是在全表扫描或索引快速全局扫描时发生的典型事件。

初始化参数DB FILE MULTIBLOCK READ COUNT决定了读取数据块的最大数目

对于oracle,等待数据文件IO的完成是正常的。存在该等待事件并不一定表示存在性能问题,但是,如果等待多块读取的时间比其他等待的时间多的多,那么就有表要调查其原因了。

等待参数:

P1:读取块的文件的号码

P2:开始读取的起始块号

P3:读取的块总数

等待时间:

无超时,会话一直等到所有的IO操作完成。

06. db file sequential read 等待事件

当进程等待顺序读取的IO完成时产生db file sequential read(数据文件顺序读取)事件。

其名有点误导,暗示多块操作,事实上它是块的读取操作。

当从索引,回滚或者撤销段,按行号(rowid)访问的表,重建控制文件,转储数据文件头或数据文件头读取时提交该事件。

对于oracle,等待数据文件IO的完成是正常的。存在该等待事件并不一定表示存在性能问题,但是,如果等待多块读取的时间比其他等待的时间多的多,那么就有表要调查其原因了。

等待参数:

P1:读取数据块的文件的号码

P2:开始读取的起始块号

P3:绝大多数情况下是1,但是临时段可以大于1

等待时间:

无超时,会话一直等到读取该块的IO操作完成。

NOTE:db file sequential read
在从磁盘接收数据的缓冲存储器内存位置邻接的时候发生。

而db file scattered read
则不保证邻接的。

磁盘数据块的连续性读

07 db file single write 事件

db file single write (数据文件单个写入)事件由DBWR提交。该时间主要在检查点期间Oracle更新数据文件头时产生。

当数据库出现不规则数据的数据文件时,你可以能会注意到该事件。

等待参数:

P1:写入的文件号码

P2:开始写入的起始块号

P3:读入的块数,通常是1

等待时间:

无超时,完成IO操作的实际时间。

08 direct path read 等待事件

当oracle将数据库直接读入会话的PGA中而不是SGA的cache中,产生direct
path read (直接路径读取)事件。直接读取以同步IO,或异步IO的模式执行。这个取决于硬件平台和初始化参数DISK ASYNCH IO
的值。直接读取IO通常用于访问驻留在磁盘上的临时段。这些操作包括排序,并行查询和散列连接。

等待的数据和等待的时间有些误导作用,如果异步IO不可用,那么会话一直会等到IO完成。单这些并不算在IO请求发布时的等待内。会话在IO请求完成后访问数据时才提交direct
path read等待事件。在这种情况下等待时间小到可以忽略不计。

等待参数:

P1:从中读取的绝对的文件号码

P2:读取的起始块号

P3:读取的块数

等待时间:

无超时,直到未完成的IO请求完成的实际时间

从数据库直接到PGA的等待事件。

09 direct path write事件

direct path write(直接路径写入)等待时间就是direct path read等待时间的相对操作。

Oracle将缓冲区从会话的PGA写入数据文件。一个会话可以发布多个写入请求,和连续的处理。
操作系统处理IO操作,如果会话需要知道IO操作是否完成,则将等待direct path write事件。
直接路径写入操作通常用于直接数据加载(append,或ctas)或者并行DML操作时写入到临时段。

对于direct path write事件,当异步事件IO正在使用中时等待的数据和等待时间的时间可能会起到误导作用。

从Oracle 8开始有一个单独用于写入非高速cache lob段的direct path write(lob)事件。

等待参数:

P1:要写入的绝对的文件号码

P2:从中写入的起始块号

P3:要写入的块数

等待时间:

无超时,直到未完成的IO请求完成的实际时间

从会话的PGA,直接到数据文件

10.enqueue等待事件

排队是oracle用来串行访问数据库资源的一种共享内存结构,进程必须获得资源的排队锁才能访问它。当获取排队的请求因其他会话正在以不兼容模式持有对资源的锁而失败时,进程将以此事件一直等待。进程在队列中等待轮到它获取所请求的队列的排队的时刻。最简单的是例子是在update的时候,另外一个session没有commit,导致的等待。

串行访问的不同资源有不同的排队类型,由两个字符的排队名称唯一的标识。例如:

ST:空间管理是的排队

SQ:序列号的排队

TX:一个事务的排队。

enqueue的等待参数描述:

P1:等待进程请求的排队名称和模式

P2:请求的锁的资源标示符ID1。同v$locak.ID1

P3:请求的锁的资源的标识符ID2,同v$lock.ID2

资源标示符ID1,和ID2的值取决于排队的名称。

select sid, chr(bitand(p1,-16777216)/16777215)||chr(bitand(p1,16777216)/65535) "Name", (bitand(p1,65535)) "Mode"

from v$session_wait

where event='enqueue';

等待时间:

取决于排队的名称,单在绝大多数的情况下,Oracle等待到3秒钟,或者知道排队资源变成可用,无论哪一个早先发生。当等待时间超时,oracle将检查持有锁的会话是否依然存活。若是,则在等待一次。

11 free buffer waits等待事件

当会话在数据库cache中找不到空闲的cache以读入数据块或者建立一个数据块的一致性读取(CR)映像时产生free buffer waits(空闲缓冲区等待)事件。这就意味着或是database的
cache太小,或者是cache中脏数据块写入磁盘的速度不够快。进程将发信号通知DBWR释放缓冲区且以该事件等待。

等待参数:

P1:Oracle读取块的的文件号码

P2:文件中oracle读入缓冲区的块号

P3:显示缓存cache中LRU和LRUW列表的set id#

等待时间:

oracle将用最多1秒的时间来等待空闲缓冲区变成可用,然后再次尝试查找空闲缓冲区。

找不到空闲的cache以读入一个数据块的一致性读(CR)的副本。或者cache中脏数据写入磁盘的额速度不够快。

12 latch free等待事件

当进程需要获得锁存器而此时该锁存器正在被其他进程持有时,产生latch free(锁存器空闲)等待事件。类似于queue,oracle使用latch来保护数据结构。

一次只能在一个进程获得latch后修改或者检查数据结构,其他需要访问该数据结构的进程必须等待他们获得latch之后,

不同于排队的是,请求latch的进程不需要在队列中等待。

如果获得latch请求失败,则进程仅仅等待一小段时间久可以再次请求锁存器。这一小段时间成为自旋(spin)。如果在一次或者多次自旋重复(spin
iterations)之后还没有获得latch,进程就会休眠一小段时间,然后再次尝试获取latch,接下来休眠更长一段时间,直到最后获得latch

最常见的latch有:cache buffer chains(高速缓存缓冲区链),
library cache(高速库缓存)和shared pool(共享池)。

等待参数:

P1:进程等待的锁存器的地址

P2:锁存器号,同V$LATCHNAME.LATCH#

P3:尝试的次数,显示进程视图获取锁存器的次数的计数器。

select * from v$latchename where latch#= &p2 value;

等待时间:

该事件的等待是呈指数级增长,它不包括进程为锁存器自旋(spin)花费的时间。

13 library cache pin等待事件

library cache pin 等待时间与library cache并发性有关系。

当会话尝试在库高速缓存中钉住对象以修改或者检查该对象的时候会产生该事件。

会话必须获取pin以确保此时对象没有被其他会话修改。当会话正在编译或者分析PL/SQL过程和视图时,oracle提交该事件。

下面SQL语句用来显示在等待中持有或者请求由P1给定对象的pin的会话

select s.sid , kglpnmod "Mode" , kglpnreq "Req"

from x$kglpn p, v$session s

where p.kglpnuse=s.saddr and kglpnhdl ='&P1RAW';

等待参数:

P1:被检查或加载的对象的地址

P2:加载锁的地址

P3:包含模式加上命名空间(模式指示将加载对象的哪一个数据片,命名空间是显示在v$db_object_cache视图中的对象命名空间)

等待时间:

对于PMON进程是1秒,对于其他进程是3秒

14. library cache lock等待事件

library cache lock等待时间也与library cache并发性有关。当会话尝试在library cache中修改或者检查给定对象的时候产生该事件。会话必须获取对象句柄的library
cache锁。以阻止其他会话同时访问它,或者维持一段较长时间的依赖性,或在library cache中给对象定位。

等待参数:

P1:被检查或加载的对象的地址

P2:加载锁的地址

P3:包含模式加上命名空间(模式指示将加载对象的哪一个数据片,命名空间是显示在v$db_object_cache视图中的对象命名空间)

等待时间:

对于PMON进程是1秒,对于其他进程是3秒

15 log buffer space等待事件

当会话必须等待log buffer中的空间变成可以用于写新信息的时候产生log buffer space (日志缓冲区空间)等待事件。LGWR进程周期性的从日志缓冲区中写入重做日志文件,使得那些日志缓冲区可以重复使用,该等待表示应用程序生产重做日志的速度比LGWR进程将其写入redo
log中的速度快。这要么是log buffer太小,那么就是重做日志在磁盘文件上存在IO争用。

等待参数:

没有等地啊参数

等待时间:

通常是1秒,单如果会话必须等待一个日志文件转换完成时则是5秒。

16 log file parallel write等待事件

当会话等待LGWR进程将log buffer中的redo信息写入到redo log的所有成员中,会产生log
file paralle write 等待事件。该事件通常有LGWR进程提交。仅当使用异步IO的时候,LGWR进程并行写入到active的日志文件成员。否则它会顺序的写入到每个活动的成员。

该等待时间通常表示redo log所处的磁盘设别缓慢或者存在争用。

等待参数:

P1:写入的日志文件号

P2:写入的OS块号

P3:IO请求的号码

等待时间:

完成所有IO所占用的实际时间,虽然日志写入文件时并行的,但是只有等待最后一个IO操作完成时整个写入操作才算完成。

17 log file sequential read 等待事件

当进程等待从联机重做日志文件读入块时产生log file sequential read(日志顺序读取)等待事件,ARCH进程在读取重做日志文件时会遇到此等待事件。

等待参数:

P1:重做日志组中重做日志文件的相对序号

P2:开始读入的块号

P3:从P2值开始读入OS的块号

等待时间:

完成请求读取的IO锁占用的实际时间。

18 log file switch (archiving needed)等待事件

表示写入redo
log 时 ARCH进程的速度跟不上LGWR进程。

等待参数:

没有等待参数

等待时间:

1秒

19 log file switch(checkpoint incomplete)等待事件

表示进程在等待日志转换完成,但是因为对于此日志文件的检查点进程未完成而使得日志文件转换得不到可能。当重做日志文件容量太小时会出现该事件。

等待参数:

没有等待参数

等待时间:

1秒

20 log file switch completion 等待事件

当进程在等待日志转换完成时产生log file switch completion (日志文件转换完成)等待事件

等待参数:

没有等待参数

等待时间:

1秒

21 log file sync 等待事件

当用户会话通过提交或者回滚一个事务时,必须使用LGWR进程将会话重做信息写入重做日志。会话才能继续其处理,进程以
log file sync(日志文件同步)等待事件等待LGWR进程完成对重做日志文件的IO

如果会话继续在相同缓冲区(buffer#)上等待,那么V$session wait视图的seq#列应没表中递增。如果不是,那么本地会话存在一个等待事件超时的问题。

若SEQ#列在递增,则造成阻塞的进程是LGWR进程,需要检查看是什么等待LGWR进程。因为它可能是卡主了。

等待参数:

P1:需要同步的日志缓冲区的缓冲区号

P2:未使用

P3:未使用

等待时间:

1秒

22 SQL *Net message from client等待

等会话等待一个来自客户端的消息的到达时提交该等待事件。一般而言,这意味着会话处于空闲状态。在不适用键盘终端的用户交互的批处理程序中,若等待时间过长,则表示应用程序的代码或者网络层存在低效率的因素。一般不是数据库层面的问题。

23 SQL *Net message to client等待事件

当会话发送一个消息到客户端时提交该等待事件,客户端进程可能太忙而不能接受消息的传递,是的服务器端存在等待,或者因为网络延迟。

Oracle RAC环境中的常见等待事件

1 global cache cr request(gc cr request)

当会话用远程实例的cache查找缓冲区的一致性读取(CR)副本时,会在global
cache cr request 事件上等待,知道cache在本地实例中可用。通常持有者狗仔cache的cr版本,然后通过高速互联传输给请求实例。当cr缓冲区到本地缓存时,等待结束。

从10g开始 global cache cr request
等待事件成为gc cr request等待。

等待参数:

P1:Oracle从中读取的块的文件号

P2:Oracle想从文件中读如缓冲区的块号

P3:缓冲区的锁元素号和类

等待时间:

等待最多为超时之间的1秒。实际等待事件是一直等待请求的实例以要求的兼容模式高速缓存缓存缓冲区。

2 buffer busy global cache(gc buffer busy)

当会话想要修改远程实例中cache中的一个缓冲区的时候,在buffer
global cache(缓冲区忙全局高速缓存)事件上等待。该事件属于类似单个实例体系结构中的buffer busy wait事件。该等待事件发生在高速缓存层。

也就是说该会话在本地cache中等待一个缓冲区,此时本地的cache因为等待一个全局cache请求的完成而忙碌。RAC层的等待记录在global
cache busy等待事件。

自10g起 buffer busy global cache
成为gc buffer busy等待。

等待参数:

P1:Oracle从中读取的块的文件号

P2:Oracle想从文件中读如缓冲区的块号

P3:表示原因的数值型代码

等待时间:

等待时间为超时之间的1秒。

3 buffer busy global cr(gc cr block busy)

当一个以上的会话在同一个实例中排队等待缓冲区的一个CR副本,而该期待的CR副本来自远程实例,会话在buffer busy global cr事件上等待。一旦来自远程实例的cr副本到达本地缓存。在缓冲区可用之前将块SCN与快照的SCN进行对比。

10g之后,该等待事件被称为gc cr block busy事件。

等待参数:

P1:Oracle读取的块的文件号

P2:Oracle想从文件中读如缓冲区的块号

P3:表示原因的数值型代码

等待时间:

等待时间为超时之间的1秒。

4 global cache busy

当会话想要修改以共享模式持有的缓冲区的时候,必须在global cache busy事件上等待。直到他们以当前模式获得该缓冲区。该事件通常在实例想从远端实例获取缓冲区,而锁转换为获取进程正在紧张中时发生。

通常,段头,索引块,和位图段块以共享模式持有。在对段增加新块期间,缓冲区从共享当前模式转换为独占当前模式。

通常,
global cache s to x等待紧跟在global cache busy等待后发生。这些等待过长表示远程实例上的互连缓慢或存在对该块重做的清除转储的延迟。

等待参数:

P1:Oracle从中读取的块的文件号

P2:Oracle想从文件中读如缓冲区的块号

P3:缓冲区的锁元素号或类

等待时间:

等待时间为超时之间的1秒。

5 global cache null to x

当会话要修改块时,必须以独占模式在其本地高速缓存中持有该块。当缓冲区不以任何其他模式在其本地高速缓存中时会话等待global
cache null to x (全局高速缓存模式至独占模式)等待事件,若该缓冲区在远程实例的全局高速缓存中。则将其运送至本地高速缓存并授以那个缓冲区的独占锁,转换万恒后统计global cache current blocks served递增。

若该缓冲区不以任何其他模式在远程高速缓存中持有。则全局高速缓存服务对其授以适当模式的锁。一旦锁授予该缓冲区,就执行磁盘IO以从磁盘读入缓冲区。

等待参数:

P1:Oracle读取的块的文件号

P2:Oracle想从文件中读如缓冲区的块号

P3:表示原因的数值型代码

等待时间:

等待时间为超时之间的1秒。

6 global cache null to s

当会话要读取缓冲区是,必须从空模式切换至共享模式,该缓冲区不是全局缓存可以从磁盘读取,或通过互连从其他势力的缓存中获得。

等待参数:

P1:Oracle读取的块的文件号

P2:Oracle想从文件中读如缓冲区的块号

P3:缓冲区的所元素号或类

等待时间:

1秒。

7 global cache s to x

当会话以共享模式持有缓冲区而想要转到以独占模式持有时,在global cache s to x
上等待。如果没有其他的实例以共享模式或者独占模式持有该缓冲区,则global cache coverts计数器递增后将立即更新锁至独占模式。如果有任何其他实例以共享模式持有该缓冲区,则锁模式降级为空模式。

等待参数:

P1:Oracle读取的块的文件号

P2:Oracle想从文件中读如缓冲区的块号

P3:缓冲区的所元素号或类

等待时间:

1秒。

8 global cache open x

当会话要修改当前快(通常是插入和批量加载)而该块没有以任何模式缓存在本地实例中时,该会话在global cache open x上等待。当前快必须来自远程实例或磁盘。若块没有存储在任何高速缓存中,且对全局高速缓存时一个新块。则不涉及锁的转换。其进程被称为newing,且在新块分配至自由表链或者位映射段时发生。

等待参数:

P1:Oracle读取的块的文件号

P2:Oracle想从文件中读如缓冲区的块号

P3:缓冲区的所元素号或类

等待时间:

1秒。

9 global cache open s

当会话第一次将块读入cache时等待global cache open s(全局高速缓存开启共享模式)事件。该事件可能在开始或者块正第一读入本地cache时发生。该块可以是从磁盘读入,也可以是从其他实例高速缓存中传递过来。

等待参数:

P1:Oracle读取的块的文件号

P2:Oracle想从文件中读如缓冲区的块号

P3:缓冲区的所元素号或类

等待时间:

1秒。

10 row cache lock

字典的高速缓存被称为行高速缓存,以为它以行级别保存信息。与之相对对的缓存cache是以块级别保存信息。保护数据字典对象定义的锁称为row cache lock。通常DDL语句请求row
cache lock。而会话则等待row cache lock等待事件来锁定数据字典信息。

该等待不是rac特有的等待。在单实例中也可用。只是在rac环境中有更大的影响,因为library cache
和行cache是全局协调的。

等待参数:

P1:会话等待的行高速缓存锁的缓存ID号,可以从v$rowcache获得

P2:持有锁的模式

P3:请求锁的模式

以下语句用来从v$rowcache中找到高速缓存号

select cache#, type, parameter

from v$rowcache

where cache# =&P1;

等待时间:

超时之间的3秒。100超时以后,回滚进程。会话在alert.log中写入waited too long for a row cache
enqueue lock 然后进程终止。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: