程序员笔记|全面解析Oracle等待事件的分类、发现及优化

本文详细介绍了Oracle等待事件的起源、分类、理解与观察方法,以及常见的等待事件及其优化策略。等待事件是数据库性能优化的重要入口,通过区分空闲与非空闲等待事件,理解不同等待事件类别,结合Oracle提供的视图如v$event_name、v$system_wait_class等,可以帮助DBA识别和解决性能瓶颈。常见等待事件如buffer busy waits、buffer latch等,各有其优化方向。
摘要由CSDN通过智能技术生成

一、等待事件由来

大家可能有些奇怪,为什么说等待事件,先谈到了指标体系。其实,正是因为指标体系的发展,才导致等待事件的引入。总结一下,Oracle的指标体系,大致经历了下面三个阶段:

  • 以命中率为主要参考指标

以各种命中率为主要的优化入口依据,常见的有”library cache hit radio“等。但这种方式弊端很大,一个命中率为99%的系统,不一定就比95%的系统优化的更好。在老的Oracle版本中,往往采用这种方式,如8i、9i等。

  • 以等待事件为主要参考指标

以各种等待事件为优化入口依据,常见的有"db file sequential read"等。可以较直观的了解,在一段时间内,数据库主要经历了那些等待。这些"瓶颈",往往就是我们优化的着手点。在10g、11g版本中,广泛使用。

  • 以时间模型为主要参考指标

以各种资源整体消耗为优化入口依据。可以从整体角度了解数据库在一段时间内的消耗情况。较等待事件的方式,更有概括性。常见的如"DB Time"。Oracle在不断加强这个方面的工作。

从上面三个阶段可见,等待事件的引入,正是为了解决以命中率为指标的诸多弊端。与后面的时间模型相比,等待事件以更加直观、细粒度的方式观察Oracle的行为,往往作为优化的重要入口。而时间模型,更侧重于整体、系统性的了解数据库运行状态。两者的侧重点不同。

二、等待事件分类

让我们首先从等待事件的分类入手,认识等待事件。从大的分类上来看,等待事件可分为空闲的、非空闲的两大部分。在非空闲的等待事件,又可进一步划分细的类别。

可以通过下面的方法,观察系统包含的等待事件数量及大致分类(以下语句在11g环境运行)。

其中WAIT_CLASS为“Idle”的等待事件就是空闲的,其他的都是非空闲的等待事件。

1. 区分 — 空闲与非空闲等待事件

空闲等待事件,是指Oracle正等待某种工作,比如用sqlplus登录之后,但没有进一步发出任何命令,此时该session就处于SQL*Net message from/to client等待事件状态,等待用户发出命令,任何的在诊断和优化数据库的时候,一般不用过多注意这部分事件。

非空闲等待事件,专门针对Oracle的活动,指数据库任务或应用运行过程中发生的等待,这些等待事件是调整数据库的时候应该关注与研究的。

2. 等待事件分类说明

  • 管理类-Administrative

此类等待事件是由于DBA的管理命令引起的,这些命令要求用户处于等待状态(比如,重建索引) 。

  • 应用程序类-Application

此类等待事件是由于用户应用程序的代码引起的(比如,锁等待) 。

  • 群集类-Cluster

此类等待事件和真正应用群集RAC的资源有关(比如,gc cr block busy等待事件) 。

  • 提交确认类-Commit

此类等待事件只包含一种等待事件——在执行了一个commit命令后,等待一个重做日志写确认(也就是log file sync) 。

  • 并发类-Concurrency

此类等待事件是由内部数据库资源引起的(比如闩锁) 。

  • 配置类-Configuration

此类等待事件是由数据库或实例的不当配置造成的(比如,重做日志文件尺寸太小,共享池的大小等) 。

  • 空闲类-Idle

此类等待事件意味着会话不活跃,等待工作(比如,sql * net messages from client) 。

  • 网络类-Network

和网络环境相关的一些等待事件(比如sql* net more data to dblink) 。

  • 其它类-Other

此类等待事件通常比较少见(比如wait for EMON to spawn) 。

  • 调度类-Scheduler

此类等待事件和资源管理相关(比如resmgr: become active’) 。

  • 系统I/O类-System I/O

此类等待事件通过是由后台进程的I/O操作引起的(比如DBWR等待-db file paralle write) 。

  • 用户I/O类-User I/O

此类等待事件通常是由用户I/O操作引起的(比如db file sequential read) 。

三、理解等待事件

每一个等待事件,都表明数据库的一种活动状态。从上面的查询可见,系统内置了很多等待事件,可以通过数据字典V$EVENT_NAME去了解每个等待事件。下面通过一个最为常见的等待事件进行说明。

这个等待事件“db file sequential read”,直译过来为“数据文件顺序读取”,是属于“User I/O”类的等待事件。它通常是与单个数据块相关的读取操作,大多数情况下读取一个索引块或者通过索引读取一个数据块,会记录这个等待。该事件说明在单个数据块上大量等待,该值过高通常是由于表间连接顺序很糟糕,或者使用了非选择性索引。通过将这种等待与statspack报表中已知其它问题联系起来(如效率不高的sql),通过检查确保索引扫描是必须的,并确保多表连接的连接顺序来调整,DB_CACHE_SIZE可以决定该事件出现的频率。

该等待事件包含了三个参数,分别为:

  • file#: 代表oracle要读取的文件的绝对文件号

  • block#: 从这个文件中开始读取的起始数据块块号

  • blocks: 读取的block数量。通常是1,表示单个block读取。

通过上面这些参数,关联数据字典可以确定发生等待事件的对象(即找到了热点对象)。然后针对不同的情况,有针对性的进行解决。

对等待事件的了解越多,可更加深入理解数据库运行机制,进而提高整体优化能力。后面,我会介绍一下常见的等待事件。

四、观察等待事件

系统内置了一些视图,通过这些视图可以了解整体(系统级)、局部(会话级)的等待事件发生情况及各类别事件的分类统计。下面针对一些主要的视图,说明一下。

1、v$event_name

系统支持的等待事件,可以查看等待事件所属类别、参数的含义等信息。

2、v$system_wait_class

displays the instance-wide time totals for each registered wait class.

等待事件类别的统计信息(系统级)。通过这一视图,可从全局角度了解系统那类操作等待较多。

3、v$system_event

等待事件的统计信息(系统级)。展开来说,是提供了自实例启动后各个等待事件的概括。常用于获取系统等待信息的历史影象。而通过两个snapshot获取等待项增量,则可以确定这段时间内系统的等待项。

主要的字段包括:

  • TOTAL_WAITS

自数据库启动到现在,此等待事件总等待次数。

  • TIME_WAITED

此等待事件的总等待时间(单位:百分之一秒)。这个数据表示从数据库启动以来这个等待事件在所有会话(包括已经结束和正保持连接状态的会话)总的等待事件之和。

  • AVERAGE_WAIT

此等待事件的平均等待用时(单位:百分之一秒)。

time_waited/total_waits

  • TOTAL_TIMEOUTS

此等待事件总等待超时次数。

SQL – 按等待时长查看顶级事件

4、v$session_event

和v s y s t e m _ e v e n t 相 类 似 , 记 录 的 是 会 话 在 其 生 命 周 期 中 各 个 等 待 事 件 的 累 计 值 。 跟 前 者 相 比 , 增 加 了 s e s s i o n _ i

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值