关于等待事件"read by other session"

在查看数据库负载的时候,发现早上10点开始到12点的这两个钟头,系统负载异常的高。于是抓取了一个awr报告。

Snap Id Snap Time Sessions Cursors/Session
Begin Snap: 24027 18-Dec-14 10:00:43 3065 6.6
End Snap: 24033 18-Dec-14 11:00:48 3441 6.5
Elapsed:   60.08 (mins)    
DB Time:   3,650.67 (mins)    

可以从profile里看到,系统的IO负载还是很高的。

Load Profile

Per Second Per Transaction Per Exec Per Call
DB Time(s): 60.8 1.2 0.02 0.01
DB CPU(s): 10.2 0.2 0.00 0.00
Redo size: 1,835,598.3 35,780.1    
Logical reads: 1,910,437.0 37,238.9    
Block changes: 4,923.1 96.0    
Physical reads: 182,370.1 3,554.8    
Physical writes: 1,670.7 32.6    
User calls: 7,331.1 142.9    
Parses: 2,128.1 41.5    
Hard parses: 8.4 0.2    
W/A MB processed: 48.0 0.9    
Logons: 3.5 0.1    
Executes: 3,911.2 76.2    
Rollbacks: 1.5 0.0    
Transactions: 51.3      

等待事件的情况如下:

Top 5 Timed Foreground Events

Event Waits Time(s) Avg wait (ms) % DB time Wait Class
db file sequential read 24,806,147 91,539 4 41.79 User I/O
read by other session 20,260,140 37,030 2 16.91 User I/O
DB CPU   36,766   16.79  
direct path read 3,090,582 30,292 10 13.83 User I/O
log file sync 191,401 7,738 40 3.53 Commit

看完awr报告,大概能够定位是sql的问题了,直接生成了一个addm报告,作为参考。最后确认发现的几个问题sql已经在修复了,还没有部署到生产中。
今天想仔细的分析一下,毕竟很多东西都是在实践中总结出来的。
对于read by other session自己还是比较陌生的。
从metalink的描述来看。这个等待事件是在10g之后对于buffer busy waits 的一个细分。(MOS ID "Read By Other Session" Wait Event (Doc ID 732891.1))
This wait event occurs when we are trying to access a buffer in the buffer cache but we find that the buffer is currently being read from disk by another user so we need to wait for that to complete before we can access it.  In previous versions, this wait was classified under the "buffer busy waits" event. However, in Oracle 10.1 and higher, the wait time is now broken out into the "read by other session" wait event.

Excessive waits for this event are typically due to several processes repeatedly reading the same blocks, e.g. many sessions scanning the same index or performing full table scans on the same table. Tuning this issue is a matter of finding and eliminating this contention. 

对于这个等待事件可以结合awr和ash来进行排查。
首先我们在awr报告中已经得知这个等待事件,一般都会存在sequential read。但是通过awr不能清晰的定位出哪些sql语句和这个等待事件相关。
使用ash可以把时间段有针对性的调整在一个合理的范围。如果问题已经发生了一段时间,我们可以通过历史数据能够大体定位。
Top SQL with Top Events

SQL ID Planhash Sampled # of Executions % Activity Event % Event Top Row Source % RwSrc SQL Text
guqd44uzkyy56 3622987757 73 8.72 direct path read 6.48 TABLE ACCESS - FULL 6.48 SELECT /*+leading(CYC_CUST) p...
        db file sequential read 1.30 INDEX - RANGE SCAN 0.80
a6a7y2bsmmpjb 2808023112 4 8.54 CPU + Wait for CPU 4.42 INDEX - UNIQUE SCAN 1.41 SELECT COUNT(1) FROM (/* 
        db file sequential read 2.28 INDEX - UNIQUE SCAN 1.74
        read by other session 1.56 INDEX - UNIQUE SCAN 1.56
fg5mc598u799u 2134445868 6 7.24 db file sequential read 3.58 TABLE ACCESS - BY INDEX ROWID 2.61 select /*+ leading (bpm_ai bpm...
        read by other session 2.14 TABLE ACCESS - BY INDEX ROWID 1.88
        db file parallel read 1.12 TABLE ACCESS - BY INDEX ROWID 1.12
6h6dj1tnz3gwt 1565267664 35 5.03 direct path read 4.71 TABLE ACCESS - FULL 4.71 SELECT /*+parallel(CYC_PAY...
6w3p95uqduya3 561414009 71 4.27 direct path read 3.87 TABLE ACCESS - FULL 3.87 SELECT SUB.CUSTOMER_ID FROM SU...

对于read by other session,和热点块也是相关的。
我们可以使用下面的sql语句来查看一下指定时间段内的等待事件的细节。
通过ash中的Top Event P1/P2/P3 Values能够直接找到。

Event % Event P1 Value, P2 Value, P3 Value % Activity Parameter 1 Parameter 2 Parameter 3
db file sequential read 43.11 "1","3386","1" 0.04 file# block# blocks
direct path read 25.62 "5","756618","127" 0.07 file number first dba block cnt
read by other session 3.98 "46","1609148","1" 0.07 file# block# class#
db file scattered read 2.53 "3","116107","126" 0.04 file# block# blocks
db file parallel read 2.50 "2","2","2" 0.51 files blocks requests

或者通过如下的sql语句来看看对应的热点块。
SQL> SELECT relative_fno, owner, segment_name, segment_type FROM dba_extents
       WHERE file_id = 46
       AND 1609148 BETWEEN block_id AND block_id + blocks - 1;
RELATIVE_FNO OWNER                          SEGMENT_NAME                                                                      SEGMENT_TYPE
------------ ------------------------------ --------------------------------------------------------------------------------- ------------------
          20   APPO                            PAYMENT_DETAILS_PK                                                            INDEX PARTITION
    
a6a7y2bsmmpjb这条sql语句在文章(巧用rowid简化sql查询 http://blog.itpub.net/23718752/viewspace-1240404/)已经做了讨论。
但是不知道什么原因被遗漏了,和客户做了确认。
fg5mc598u799u这条sql语句是在产品线中统一规划的,已经使用Hint稳定了执行计划,但是涉及的几个表都是千万的大表,查询中使用了并行,同时需要在多台服务器中同时执行这条语句。这样的话,就会存在多个session执行
多个并行查询。从这个角度来说发生read by other session也是意料之中的。因为这个查询是一个分页查询,从操作上也可以做一些优化,目前是每隔10分钟做一次查询,然后查取1000条相关的数据。和业务部分协调的结果是,每隔半个小时执行一次查询,每次查取3000条数据。

可能一个等待事件中能够体现出一个表象。更多的细节还需要排查确认,很多优化工作不止能从数据库层面做,还可以从业务层面调整。

关于IO诊断的一些问题,可以参考 Troubleshooting I/O Related Waits (Doc ID 223117.1)

时间: 2024-07-30 10:59:42

关于等待事件"read by other session"的相关文章

oracle等待事件3——高速缓冲内enq锁

6. enq:TC-contention 在手动执行检查点操作中,一部分需要获得TC锁(thread checkpointlock 或 tablespace checkpointlock )在获得TC锁过程中,若发生争用,则需要等待enq:TC-contention 事件.事实上获得TC锁的过程稍微复杂. 1) 服务器进程首先以X模式获得TC锁 2) 服务器进程将已获得的TC锁变更为SSX模式.同时,CKPT进程以SS模式获得该锁.CKPT获得锁后执行检查点操作. 3) 服务器欲重新以X模式获得

SQL SERVER中的OLEDB等待事件

OLEDB等待事件介绍 OLEDB等待类型是SQL SERVER 数据库中最常见的几种等待类型之一.它意味着某个会话(SPID)通过SQL Server Native Client OLEDB Provider发生了调用请求并等待数据库返回所需的数据.它出现在远程系统(remote system )或网络连接速度不够快,因此调用服务器必须等待要返回结果的情况下.OLEDB等待事件一般是由那些活动造成呢?它一般由下面一些事件引起: 远程过程调用(Remote procedure calls) 链接

ORACLE等待事件:SQL*Net message from client & SQL*Net message to client

在ORACLE当中有两个很常见的等待事件"SQL*Net message from client"与"SQL*Net message to client",两者有点区别,下面整理这方面的资料如下:     SQL*Net message from client      表示服务端等待着Cilent发来请求让它处理,这时就会产生SQL*Net message from client等待事件.                                 而我们把这

与IO相关的等待事件troubleshooting-系列1

近来XX应用充分暴露出开发人员最初只关心功能,未考虑性能的问题,夜维.OLTP应用均出现了不同程度的与数据库相关的性能问题. 这个应用所在磁盘的IO较差,原因在于这块磁盘较旧,已进入更换的流程,但短期内还不能更换,对应用是个极大的隐患.而且也出现过某段时间IO非常差,导致应用处理速度非常缓慢.针对与IO相关的性能问题,MOS有篇文章(223117.1)介绍的就是与IO相关的troubleshooting,拜读一下. 这篇文章的目的:针对主要争用是IO相关的场景下,Oracle调优的一些思路. 主

等待事件:PX Deq Credit: send blkd?TOAD ? GV$SESSION

等待事件:PX Deq Credit: send blkd?TOAD ? GV$SESSION     昨天看AWR报表,发现系统出现大量的PX Deq Credit: send blkd等待事件.Event                  Waits Time(s) Avg Wait(ms)  % Total Call Time Wait ClassPX Deq Credit: send blkd  905  1,829   2,021         74.9              O

Statspack之十四-"log file sync" 等待事件

原文出处: http://www.eygle.com/statspack/statspack14-LogFileSync.htm 当一个用户提交(commits)或者回滚(rollback),session的redo信息需要写出到redo logfile中.用户进程将通知LGWR执行写出操作,LGWR完成任务以后会通知用户进程.这个等待事件就是指用户进程等待LGWR的写完成通知. 对于回滚操作,该事件记录从用户发出rollback命令到回滚完成的时间. 如果该等待过多,可能说明LGWR的写出效率

怎样诊断过去某个时间段的等待事件原因

1.查看某个等待事件的阻塞会话 select event,blocking_session,sql_id,count(*) from dba_hist_active_sess_history ash    where sample_time>=to_timestamp('2013-06-24 12:25:00','yyyy-mm-dd hh24:mi:ss')    and sample_time<=to_timestamp('2013-06-24 12:35:00','yyyy-mm-dd

Oracle常见的等待事件

db file scattered read 对于一些频繁访问的表,如果没有建立索引或没有建立 合适的索引,Oracle只能对其进行全表扫描,就会导致大量该等待事件. 全表扫描时,读 取的数据在磁盘上一般是连续的,但是读到内存时却是不连续的,因此该事件命名为离散读 (scattered read),注意不要被它的名字所迷惑. 一次多块读取的数量受参数 DB_FILE_MULTIBLOCK_READ_COUNT的影响. 在实际诊断过程中,可以通过v$session_wait 视图发现session

Oracle中常见的33个等待事件小结

在Oracle 10g中的等待事件有872个,11g中等待事件1116个. 我们可以通过v$event_name 视图来查看等待事件的相关信息   一. 等待事件的相关知识 1.1 等待事件主要可以分为两类,即空闲(IDLE)等待事件和非空闲(NON-IDLE)等待事件. 1). 空闲等待事件指ORACLE正等待某种工作,在诊断和优化数据库的时候,不用过多注意这部分事件. 2). 非空闲等待事件专门针对ORACLE的活动,指数据库任务或应用运行过程中发生的等待,这些等待事件 是在调整数据库的时候