资源描述:
《[摘录]Oracle Wait Interface之Buffer busy waits事件》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、[摘录]OracleWaitInterface之Bufferbusywaits事件当进程需要存取SGA中的buffer的时候,它会依次执行如下步骤的操作:1.获得cachebufferschainslatch,遍历那条bufferchain直到找到需要的bufferheader2.根据需要进行的操作类型(读或写),它需要在bufferheader上获得一个共享或独占模式的bufferpin或者bufferlock3.若进程获得bufferheaderpin,它会释放获得的cachebufferschainslatch,然后执行对buffer
2、block的操作4.若进程无法获得bufferheaderpin,它就会在bufferbusywaits事件上等待进程之所以无法获得bufferheaderpin,是因为为了保证数据的一致性,同一时刻一个block只能被一个进程pin住进行存取,因此当一个进程需要存取buffercache中一个被其他进程使用的block的时候,这个进程就会产生对该block的bufferbusywaits事件。截至Oracle9i,bufferbusywaits事件的p1,p2,p3三个参数分别是file#,block#和id,分别表示等待的bufferb
3、lock所在的文件编号,块编号和具体的等待原因编号,到了Oracle10g,前两个参数没变,第3个参数变成了块类型编号,这一点可以通过查询v$event_name视图来进行验证:PHPcode:Oracle9iSQL>selectparameter1,parameter2,parameter3fromv$event_namewherename='bufferbusywaits';PARAMETER1PARAMETER2PARAMETER3----------------------------------------------------
4、--------------------file#block#idOracle10gPARAMETER1PARAMETER2PARAMETER3------------------------------------------------------------------------file#block#class#在诊断bufferbusywaits事件的过程中,获取如下信息会很有用:1.获取产生bufferbusywaits事件的等待原因编号,这可以通过查询该事件的p3参数值获得2.获取产生此事件的SQL语句,可以通过如下的查询获得
5、:selectsql_textfromv$sqlt1,v$sessiont2,v$session_waitt3wheret1.address=t2.sql_addressandt1.hash_value=t2.sql_hash_valueandt2.sid=t3.sidandt3.event='bufferbusywaits';3.获取等待的块的类型以及所在的segment,可以通过如下查询获得:select'SegmentHeader'class,a.segment_type,a.segment_name,a.partition_name
6、fromdba_segmentsa,v$session_waitbwherea.header_file=b.p1anda.header_block=b.p2andb.event='bufferbusywaits'unionselect'FreelistGroups'class,a.segment_type,a.segment_name,a.partition_namefromdba_segmentsa,v$session_waitbwherea.header_file=b.p1andb.p2betweena.header_block+1an
7、d(a.header_block+a.freelist_groups)anda.freelist_groups>1andb.event='bufferbusywaits'unionselecta.segment_type
8、
9、'block'class,a.segment_type,a.segment_name,a.partition_namefromdba_extentsa,v$session_waitbwherea.file_id=b.p1andb.p2betweena.block_idanda.block_id+a.blocks-1and
10、b.event='bufferbusywaits'andnotexists(select1fromdba_segmentswhereheader_file=b.p1andhead