专注Java教育12年 全国咨询/投诉热线:400-8080-105

首页 hot资讯 浅谈Oracle等待事件

浅谈Oracle等待事件

更新时间:2021-03-08 17:27 来源:动力节点 浏览74次

Oracle等待事件是衡量Oracle运行状况的重要依据及指标。等待事件的概念是在Oracle 7.0.1.2中引入的,大致有100个等待事件。在Oracle 8.0中这个数目增加到了大约150个,在Oracle 8i中大约有200个事件,而在Oracle 9i中大约有360个等待事件。

说起Oracle等待事件,我们不得不提到指标体系。其实,正是因为指标体系的发展,才导致等待事件的引入。等待事件的引入,正是为了解决以命中率为指标的诸多弊端。与后面的时间模型相比,等待事件以更加直观、细粒度的方式观察Oracle的行为,往往作为优化的重要入口。而时间模型,更侧重于整体、系统性的了解数据库运行状态。两者的侧重点不同。

等待事件主要分为两种类别,即空闲(idle)等待事件和非空闲(non-idle)等待事件。其中空闲事件指Oracle正等待某种工作,在诊断和优化数据库的时候,我们不用过多注意这部分事件。

db file分散读取是一个常见的等待事件,通常被称为“ DB文件分散读取”,这个等待事件通常与全表扫描(Full Table Scans)或快速全索引扫描(Index Fast Full Scans)相关。

当数据库进行全表扫时,基于性能的考虑,数据会分散(分散)读入缓冲区缓存。如果这个等待事件比较显着,可能说明某些某些全表扫描的表,没有创建索引或没有创建合适的索引,因此就可能需要检查这些数据表是否已进行了正确的设置。

然而这个等待事件不一定意味着性能低下,在某些条件下Oracle会主动使用全表扫描来替换索引扫描以提高性能,这和访问的数据量有关。在RBO下Oracle更容易使用索引。

因为全表扫描被替换为LRU(最近最少使用,最近最少适用)列表的冷端(冷端),对于可以访问的相对较小的数据表,可以选择将其缓存到内存中,多次重复读取。

每一个等待事件,都表明数据库的一种活动状态。当这个等待事件比较显着时,可以结合v $ session_longops动态性能视图来进行诊断,该视图中记录了连续(运行时间超过6秒的)运行的事物,可能很多是全表扫描操作(不管怎样,这部分信息都是重力的)。下面通过一个最为常见的等待事件进行说明。

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

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

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

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

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

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

对oracle等待事件的了解越多,则可更加深入理解数据库运行机制,进而提高整体优化能力。在本站的Oracle教程中,对Oracle等待事件的运行机制和等待事件的观察都有很详细的讲解,能够帮助我们有效地理解等待事件的前因后果。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>

返回顶部