Oracle 常见的33个等待事件(三)

2014-11-24 14:59:17 · 作者: · 浏览: 5
Timeouts等待的超时时间。

7. Db file scattered read

这个等待事件在实际生产库中经常可以看到,这是一个用户操作引起的等待事件,当用户发出每次I/O需要读取多个数据块这样的SQL 操作时,会产生这个等待事件,最常见的两种情况是全表扫描(FTS: Full Table Scan)和索引快速扫描(IFFS: index fast full scan)。

这个名称中的scattered( 发散),可能会导致很多人认为它是以scattered 的方式来读取数据块的,其实恰恰相反,当发生这种等待事件时,SQL的操作都是顺序地读取数据块的,比如FTS或者IFFS方式(如果忽略需要读取的数据块已经存在内存中的情况)。

这里的scattered指的是读取的数据块在内存中的存放方式,他们被读取到内存中后,是以分散的方式存在在内存中,而不是连续的。

这个等待事件有三个参数:

File# 要读取的数据块所在数据文件的文件号。

Block# 要读取的起始数据块号。

Blocks需要读取的数据块数目。

8. Db file sequential read

这个等待事件在实际生产库也很常见,当Oracle 需要每次I/O只读取单个数据块这样的操作时,会产生这个等待事件。 最常见的情况有索引的访问(除IFFS外的方式),回滚操作,以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 2010/8/12 11:00:56 (QP5 v5.115.810.9015) */

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'

Oracle 的enqueue 包含以下模式:

模式代码

解释

1

Null mode

2

Sub-Share

3

Sub-Exclusive

4

Share

5

Share/Sub-Exclusive

6

Exclusive

Oracle的enqueue 有如下类型:

Enqueue 缩写

缩写解释

BL

Buffer Cache management

BR

Backup/Restore

CF

Controlfile transaction

CI

Cross-instance Call Invocation

CU

Bind Enqueue

DF

Datafile

DL

Direct Loader Index Creation

DM

Database Mount

DR

Distributed Recovery Process

DX

Dirstributed Transaction

FP

File Object

FS

File Set

HW

High-water Lock

IN

Instance Number

IR

Instance Recovery

IS

Instance State

IV

Library Cache I