oracle 等待
ORACLE的等待事件,主要可以分为两类,即空闲(IDLE)等待事件和非空闲(NON-IDLE)等待事件。
1).空闲等待事件指ORACLE正等待某种工作,在诊断和优化数据库的时候,不用过多注意这部分事件。
2).非空闲等待事件专门针对ORACLE的活动,指数据库任务或应用运行过程中发生的等待,这些等待事件是在调整数据库的时候需要关注与研究的。
下面来看一下ORACLE10GR2中主要分类及各类等待事件的个数:
SQL>selectwait_class#,wait_class_id,wait_class,count(*)as"count"
2fromv$event_name
3groupbywait_class#,wait_class_id,wait_class
4orderbywait_class#;
WAIT_CLASS#WAIT_CLASS_IDWAIT_CLASScount
----------------------------
01893977003Other588
14217450380Application12
23290255840Configuration23
34166625743Administrative46
43875070507Concurrency24
53386400367Commit1
62723168908Idle62
72000153315Network26
81740759767UserI/O17
94108307767SystemI/O24
102396326234Scheduler2
113871361733Cluster47
12rowsselected.
常见的空闲事件有:
?dispatchertimer
?lockelementcleanup
?Nullevent
?parallelquerydequeuewait
?parallelqueryidlewait-Slaves
?pipeget
?PL/SQLlocktimer
?pmontimer-pmon
?rdbmsipcmessage
?slavewait
?smontimer
?SQL*Netbreak/resettoclient
?SQL*Netmessagefromclient
?SQL*Netmessagetoclient
?SQL*Netmoredatatoclient
?virtualcircuitstatus
?clientmessage
一些常见的非空闲等待事件有:
?dbfilescatteredread
?dbfilesequentialread
?bufferbusywaits
?freebufferwaits
?enqueue
?latchfree
?logfileparallelwrite
?logfilesync
几个视图的总结:
V$SESSION代表数据库活动的开始,视为源起。
V$SESSION_WAIT视图用以实时记录活动SESSION的等待情况,是当前信息。
V$SESSION_WAIT_HISTORY是对V$SESSION_WAIT的简单增强,记录活动SESSION的最近10次等待。
V$ACTIVE_SESSION_HISTORY是ASH的核心,用以记录活动SESSION的历史等待信息,每秒采样一次,这部分内容记录在内存中,期望值是记录一个小时的内容。
WRH#_ACTIVE_SESSION_HISTORY是V$ACTIVE_SESSION_HISTORY在AWR的存储地。
V$ACTIVE_SESSION_HISTORY中的信息会被定期(每小时一次)的刷新到负载库中,并缺省保留一个星期用于分析。
DBA_HIST_ACTIVE_SESS_HISTORY视图是WRH#_ACTIVE_SESSION_HISTORY视图和其他几个视图的联合展现,通常通过这个视图进行历史数据的访问。
V$SYSTEM_EVENT由于V$SESSION记录的是动态信息,和SESSION的生命周期相关,而并不记录历史信息,所以ORACLE提供视图V$SYSTEM_EVENT来记录数据库自启动以来所有等待事件的汇总信息。通过这个视图,用户可以迅速获得数据库运行的总体概况。
V$SQLTEXT当数据库出现瓶颈时,通常可以从V$SESSION_WAIT找到那些正在等待资源的SESSION,通过SESSION的SID,联合V$SESSION和V$SQLTEXT视图就可以捕获这些SESSION正在执行的SQL语句。
重要等待事件
1.Dbfilesequentialread(数据文件顺序读取)
Dbfilesequentialread是个非常常见的I/O相关的等待事件,通常显示与单个数据块相关的读取操作,在大多数情况下,读取一个索引块或者通过索引读取一个数据块时,都会记录这个等待。
这个等待事件有3个参数P1、P2、P3,其中P1代表Oracle要读取的文件的绝对文件号,P2代表Oracle从这个文件中开始读取的起始数据块块号,P3代表读取的Block数量,通常这个值为1,表明是单个Block被读取。
SQL>selectname,parameter1,parameter2,parameter3fromv$event_namewherename='dbfilesequentialread';
NAMEPARAMETER1PARAMETER2PARAMETER3
------------------------
dbfilesequentialreadfile#block#blocks
如果这个等待事件比较显著,可能表示在多表连接中,表的连接顺序存在问题,可能没有正确的使用驱动表;或者可能索引的使用存在问题,并非索引总是最好的选择。
在大多数情况下,通过索引可以更为快速地获取记录,所以对于一个编码规范、调整良好的数据库,这个等待事件很大通常是正常的。但是在很多情况下,使用索引并不是最佳的选择,比如读取较大表中大量的数据,全表扫描可能会明显快于索引扫描,所以在开发中就应该注意,对于这样的查询应该避免使用索引扫描。
从Oracle9iR2开始,Oracle引入了段级统计信息收集的新特性,收集的统计信息共有11类:
Select*fromv$segstat_name;
在Oracle10gR2中,这类统计信息增加为15个。
对于CBO模式下的数据库,应当及时收集统计信息,使SQL可以选择正确的执行计划,避免因为统计信息陈旧而导致的执行错误等。
2.Dbfilescatteredread(数据文件离散读取)
SQL>select*fromv$event_namewherename='dbfilescatteredread';
EVENT#EVENT_IDNAMEPARAMETER1PARAMETER2PARAMETER3
---------------------------------------
188506183215dbfilescatteredreadfile#block#blocks
从V$EVENT_NAME视图可以看到,该事件有3个参数,分别代表文件号、起始数据块号、数据块的数量。
起始数据块号加上数据块的数量,这意味着Oraclesession正在等待多块连续读操作的完成。这个操作可能与全表扫描(Fulltablescan)或者快速全索引扫描(IndexFastFullScan)的连续读取相关。根据经验,通常大量的dbfilescatteredread等待可能意味着应用问题或者索引缺失。
在实际环境的诊断过程中,可以通过v$session_wait视图发现session的等待,再结合其他视图找到存在问题的SQL等根本原因,从而从根本上解决问题。当这个等待事件比较显著时,也可结合v$session_longops动态性能视图来进行诊断,该视图记录了长时间(运行时间超过6秒的)运行的事务。
从Oracle9i开始,Oracle新增加了一个视图V$SQL_PLAN用于记录当前系统LibraryCache中SQL语句的执行计划,可以通过这个视图找到存在问题的SQL语句。
通过V$SQL_PLAN视图,可以获得大量有用的信息:
获得全表扫描的对象
Selectdistinctobject_name,object_ownerfromv$sql_planpWherep.operation='TABLEACCESS'andp.options='FULL'