Oracle常见的等待事件说明(上)

88 篇文章 1 订阅
78 篇文章 0 订阅

Oracle数据库系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境,因此,它广受大数据圈相关人士的青睐。但是,在使用过程中,偶尔会遇到一些等待事件,这是为什么呢?大圣众包威客平台为你一一道来。

  1、Buffer busy waits

  从本质上讲,这个等待事件的产生仅说明了一个会话在等待一个Buffer(数据块),但是导致这个现象的原因却有很多种。常见的两种是:

  ①当一个会话视图修改一个数据块,但这个数据块正在被另一个会话修改时。

  ②当一个会话需要读取一个数据块,但这个数据块正在被另一个会话读取到内存中时。

  在新的版本中,第二种情况已经被独立出来,以read by other session取代。

  Buffer busy waits等待事件常见于数据库中存在热快的时候,当多个用户频繁地读取或者修改同样的数据块时,这个等待事件就会产生。如果等待的时间很长,在AWR或者statspack 报告中就可以看到。

  这个等待事件有三个参数。查看有几个参数可以用以下SQL:

  SQL> select name, parameter1, parameter2, parameter3 from v$event_name where name='buffer busy waits';

  NAME         PARAMETER1  PARAMETER2  PARAMETER3

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

  buffer busy waits    file#      block#     class#

  2、Buffer latch

  内存中数据块的存放位置是记录在一个hash列表(cache buffer chains)当中的。当一个会话需要访问某个数据块时,它首先要搜索这个hash 列表,从列表中获得数据块的地址,然后通过这个地址去访问需要的数据块,这个列表Oracle会使用一个latch来保护它的完整性。 当一个会话需要访问这个列表时,需要获取一个Latch,只有这样,才能保证这个列表在这个会话的浏览当中不会发生变化。

  产生buffer latch的等待事件的主要原因是:

  Buffer chains太长,导致会话搜索这个列表花费的时间太长,使其他的会话处于等待状态。

  同样的数据块被频繁访问,就是我们通常说的热快问题。

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

  ①Latch addr:会话申请的latch在SGA中的虚拟地址,通过以下的SQL语句可以根据这个地址找到它对应的Latch名称:

  select * from v$latch a,v$latchname b where addr=latch addr and a.latch#=b.latch#;

  ②chain#:buffer chains hash 列表中的索引值,当这个参数的值等于s 0xfffffff时,说明当前的会话正在等待一个LRU latch。

  3、Control file parallel write

  当数据库中有多个控制文件的拷贝时,Oracle需要保证信息同步地写到各个控制文件当中,这是一个并行的物理操作过程。因为称为控制文件并行写,当发生这样的操作时,就会产生control file parallel write等待事件。

  控制文件频繁写入的原因很多,比如:

  ①日志切换太过频繁,导致控制文件信息相应地需要频繁更新。

  ②系统I/O 出现瓶颈,导致所有I/O出现等待。

  这个等待事件包含三个参数:

  ①Files:Oracle 要写入的控制文件个数。

  ②Blocks:写入控制文件的数据块数目。

  ③Requests:写入控制请求的I/O 次数。

  4、Control file sequential read

  当数据库需要读取控制文件上的信息时,会出现这个等待事件,因为控制文件的信息是顺序写的,所以读取的时候也是顺序的,因此称为控制文件顺序读。它经常发生在以下情况:

  ①备份控制文件。

  ②RAC环境下不同实例之间控制文件的信息共享。

  ③读取控制文件的文件头信息。

  ④读取控制文件其他信息。

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

  ①File#:要读取信息的控制文件的文件号。

  ②Block#:读取控制文件信息的起始数据块号。

  ③Blocks:需要读取的控制文件数据块数目。

  5、Db file parallel read

  这是一个很容易引起误导的等待事件,实际上这个等待事件和并行操作(比如并行查询、并行DML)没有关系。 这个事件发生在数据库恢复的时候,当有一些数据块需要恢复的时候,Oracle会以并行的方式把他们从数据文件中读入到内存中进行恢复操作。

  这个等待事件包含三个参数:

  ①Files:操作需要读取的文件个数。

  ②Blocks:操作需要读取的数据块个数。

  ③Requests:操作需要执行的I/O次数。

  6、Db file parallel write

  这是一个后台等待事件,它和用户的并行操作同样没有关系。它是由后台进程DBWR产生的,当后台进程DBWR向磁盘上写入脏数据时,会发生这个等待。DBWR会批量地将脏数据并行地写入到磁盘上相应的数据文件中,在这个批次作业完成之前,DBWR将出现这个等待事件。如果仅仅是这一个等待事件,对用户的操作并没有太大的影响,当伴随着出现free buffer waits等待事件时,说明此时内存中可用的空间不足,这时候会影响到用户的操作,比如影响到用户将脏数据块读入到内存中。当出现db file parallel write等待事件时,可以通过启用操作系统的异步I/O的方式来缓解这个等待。当使用异步I/O时,DBWR不再需要一直等到所有数据块全部写入到磁盘上,它只需要等到这个数据写入到一个百分比之后,就可以继续进行后续的操作。

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

  ①Requests:操作需要执行的I/O次数。

  ②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 数量。


  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值