Oracle中常见的33个等待事件小结(四)

2015-04-07 14:09:48 · 作者: · 浏览: 171
,回滚操作,以ROWID的方式访问表中的数据,重建控制文件,对文件头做DUMP等。


?这里的sequential也并非指的是Oracle 按顺序的方式来访问数据,和db file scattered read一样,它指的是读取的数据块在内存中是以连续的方式存放的。


?这个等待事件有三个参数:
File#: 要读取的数据块锁在数据文件的文件号。
Block#: 要读取的起始数据块号。
Blocks: 要读取的数据块数目(这里应该等于1)。


?
9. Db file single write
这个等待事件通常只发生在一种情况下,就是Oracle 更新数据文件头信息时(比如发生Checkpoint)。


?当这个等待事件很明显时,需要考虑是不是数据库中的数据文件数量太大,导致Oracle 需要花较长的时间来做所有文件头的更新操作(checkpoint)。


?这个等待事件有三个参数:
File#: 需要更新的数据块所在的数据文件的文件号。
Block#: 需要更新的数据块号。
Blocks: 需要更新的数据块数目(通常来说应该等于1)。


?
10. Direct path read
这个等待事件发生在会话将数据块直接读取到PGA当中而不是SGA中的情况,这些被读取的数据通常是这个会话私有的数据,所以不需要放到SGA作为共享数据,因为这样做没有意义。这些数据通常是来自于临时段上的数据,比如一个会话中SQL的排序数据,并行执行过程中间产生的数据,以及Hash Join,merge join产生的排序数据,因为这些数据只对当前的会话的SQL操作有意义,所以不需要放到SGA当中。


?当发生direct path read等待事件时,意味着磁盘上有大量的临时数据产生,比如排序,并行执行等操作。或者意味着PGA中空闲空间不足。


?这个等待事件有三个参数:
Descriptor address:? 一个指针,指向当前会话正在等待的一个direct read I/O。
First dba: descriptor address 中最旧的一个I/O数据块地址。
Block cnt: descriptor address上下文中涉及的有效的buffer 数量。


?
11. Direct path write
这个等待事件和direct path read 正好相反,是会话将一些数据从PGA中直接写入到磁盘文件上,而不经过SGA。


?这种情况通常发生在:
?使用临时表空间排序(内存不足)
?数据的直接加载(使用append方式加载数据)
?并行DML操作。


?这个等待事件有三个参数:
Descriptor address: 一个指针,指向当前会话正在等待的一个direct I/O.
?First dba: descriptor address 中最旧的一个I/O数据块地址。
Block cnt: descriptor address 上下文中涉及的有效地 buffer 数量。


?12. Enqueue
?Enqueue 这个词其实是lock 的另一种描述语。


?当我们在AWR 报告中发现长时间的enqueue 等待事件时,说明数据库中出现了阻塞和等待,可以关联AWR报告中的enqueue activity部分来确定是哪一种锁定出现了长时间等待。


?这个等待事件有2个参数:
Name: enqueue 的名称和类型。
Mode: enqueue的模式。


?可以使用如下SQL 查看当前会话等待的enqueue名称和类型:
/* Formatted on 6/27/2011 1:31:48 PM (QP5 v5.114.809.3010) */
?SELECT? CHR (TO_CHAR (BITAND (p1, -16777216)) / 16777215)
? ? ? ? ? || CHR (TO_CHAR (BITAND (p1, 16711680)) / 65535)
? ? ? ? ? ? "Lock",
? ? ? ? ? TO_CHAR (BITAND (p1, 65535)) "Mode"
? FROM? v$session_wait
? WHERE? event = 'enqueue';


?13. Free buffer waits
当一个会话将数据块从磁盘读到内存中时,它需要到内存中找到空闲的内存空间来存放这些数据块,当内存中没有空闲的空间时,就会产生这个等待;除此之外,还有一种情况就是会话在做一致性读时,需要构造数据块在某个时刻的前映像(image),此时需要申请内存来存放这些新构造的数据块,如果内存中无法找到这样的内存块,也会发生这个等待事件。


?当数据库中出现比较严重的free buffer waits等待事件时,可能的原因是:
?(1)data buffer 太小,导致空闲空间不够
?(2)内存中的脏数据太多,DBWR无法及时将这些脏数据写到磁盘中以释放空间


?这个等待事件包含2个参数:
File#: 需要读取的数据块所在的数据文件的文件号。
Block#: 需要读取的数据块块号。


?
14. Latch free
在10g之前的版本里,latch free 等待事件代表了所有的latch等待,在10g以后,一些常用的latch事件已经被独立了出来:
11gr2:
?SQL> select name from v$event_name where name like 'latch%' order by 1;
?NAME
?----------------------------------------------------------------
?latch activity
?latch free
?latch: Change Notification Hash table latch
?latch: In memory undo latch
?latch: MQL Tracking Latch
?latch: PX hash array latch
?latch: Undo Hint Latch
?latch: WCR: processes HT
?latch: WCR: sync
?latch: cache buffer handles
?latch: cache buffers chains
?latch: cache buffers lru chain
?latch: call allocation
?latch: change notification client cache latch
?latch: checkpoint queue latch
?latch: enqueue hash chains
?latch: gc element
?latch: gcs resource hash
?latch: ges resource hash list
?latch: lob segment dispenser latch
?latch: lob segment hash table latch
?latch: lob segment query latch
?latch: messages
?latch: object queue header operation
?latch: parallel query alloc buffer
?latch: redo allocation
?latch: redo copy
?latch: redo writing
?latch: row cache objects
?latch: session allocation
?latch: shared pool
?latch: undo global data
?latch: virtual circuit queues
已选择33行。


10gr2 rac:
?sys@ORCL> select name from v$event_name where