read by other session简介html
官方关于read by other session的介绍以下:web
When information is requested from the database, Oracle will first read the data from disk into the database buffer cache. If two or more sessions request the same information, the first session will read the data into the buffer cache while other sessions wait. In previous versions this wait was classified under the "buffer busy waits" event. However, in Oracle 10.1 and higher this 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.sql
当从数据库请求信息时,Oracle将首先将数据从磁盘读入数据库缓冲区缓存。若是两个或多个会话请求相同的信息时,则第一个会话将数据读入buffer cache的过程当中,而其余会话出现等待。在以前的数据库版本中,此等待事件被归类为“buffer busy waits”等待事件。 可是,在Oracle 10.1及更高版本中,此等待时间如今划分为“read by other session”等待事件。 该等待事件的大量等待一般是因为一些进程重复读取相同的数据块,例如, 许多会话扫描同一索引或在同一个表上执行全表扫描。 调优此问题是找到并消除这种竞争。数据库
C.3.114 read by other session的介绍缓存
This event occurs when a session requests a buffer that is currently being read into the buffer cache by another session. Prior to release 10.1, waits for this event were grouped with the other reasons for waiting for buffers under the 'buffer busy waits' eventsession
Wait Time: Time waited for the buffer to be read by the other session (in microseconds)oracle
read by other session的分析app
read by other session等待的出现也说明数据库存在读的竞争,等待事件read by other session 一般与等待事件db file scattered read 和db file sequential read同时出现。有时候甚至与等待事件enq: TX - row lock contention同时出现(特殊状况,一个特殊案例中遇到的,等待read by other session的会话阻塞其它会话),以下截图所示。less
db file scattered read一般显示与全表扫描相关的等待。当数据库进行全表扫时,基于性能的考虑,数据会分散(scattered)读入Buffer Cache。若是这个等待事件比较显著,可能说明对于某些全表扫描的表,没有建立索引或者没有建立合适的索引。ide
db file sequential read一般显示与单个数据块相关的读取操做(如索引读取)。若是这个等待事件比较显著,可能表示在多表链接中,表的链接顺序存在问题,可能没有正确的使用驱动表;或者可能说明不加选择地进行索引。
read by other session解决
如何查看当前会话处于等待read by other session:
使用下面SQL找到当前处于read by other session等待的SQL语句,而后分析SQL,优化SQL
SELECT s.username,
s.sid,
s.serial#,
s.osuser,
s.machine,
s.terminal,
s.program,
s.last_call_et,
s.event,
s.seconds_in_wait,
s.blocking_session,
t.sql_text
--,t.SQL_FULLTEXT
FROM v$session s,
v$sqlarea t
WHERE s.sql_address = t.address
AND S.sid IN (SELECT sid
FROM v$session_wait
WHERE event IN ( 'read by other session' ));
或
select sql_fulltext from v$sql a,v$session b where a.sql_id=b.sql_id and b.event='read by other session';
也能够经过下面SQL,获取产生read by other session等待事件的SQL的实际执行计划,研究执行计划后,对相关SQL进行调优,例如,对于全表扫描的添加合适索引。
SELECT DISTINCT SQL_ID
FROM V$SESSION
WHERE EVENT IN('read by other session', 'db file sequential read');
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_AWR('xxxxx'));
对于非当前会话的read by other session等待事件,咱们能够经过AWR报告和ASH结合,找到发生read by other session等待的SQL语句。
1:首先分析Top 5 Timed Events,分析read by other session、db file scattered read、db file sequential read等待事件
2:AWR报告中分析Segments by Buffer Busy Waits部份内容
以下截图所示,基本上能够判断第一个表xxx就是出现
3:首先使用下面脚本找到产生了'read by other session'等待事件的SQL,而后生成指定SQL语句的统计报表(awrsqrpt.sql)以及接近采样点附近的ASH报告
SELECT
a.sql_id,
sql_fulltext
FROM
v$sql a,
dba_hist_active_sess_history b
WHERE
a.sql_id = b.sql_id
AND b.event = 'read by other session';
AWR报告里面的SQL ordered by Reads 或SQL ordered by Gets中的TOP SQL找到涉及Segments by Buffer Busy Waits中对象的SQL ,而后结合ASH(细粒度的报告)来判断、分析!。
另外,若是须要查看涉及对象信息,能够经过等待事件的字段p1,p2,p3来获取
SELECT p1 "file#"
, p2 "block#"
, p3 "class#"
FROM v$session_wait WHERE event = 'read by other session';
或
SELECT p1 "file#"
,p2 "block#"
,p3 "class#"
FROM dba_hist_active_sess_history
WHERE event = 'read by other session';
官方文档描述以下:
· P1 = file# Absolute File# (AFN)
· P2 = block#
· P3 = class# Block class
· file# Absolute File Number (AFN)
This is the file number of the data file that contains the block that the waiting session wants.
· block#
This is the block number in the above file# that the waiting session wants access to. See Note:181306.1 to determine the tablespace, filename and object for this file#,block# pair.
This is the class of block being waited on. In particular:
class 1 indicates a "data block", which could be table or index
class 4 indicates a "segment header"
class >=15 indicate undo blocks
另外,下面一些SQL来自惜分飞的“Read by other session等待事件”,很是有用。
根据FILE#,BLOCK#查询热块对象
SELECT OWNER, SEGMENT_NAME, SEGMENT_TYPE, TABLESPACE_NAME, A.PARTITION_NAME
FROM DBA_EXTENTS A
WHERE FILE_ID = &FILE_ID
AND &BLOCK_ID BETWEEN BLOCK_ID AND BLOCK_ID + BLOCKS – 1;
直接查找热点块对象语句
SELECT *
FROM (SELECT O.OWNER, O.OBJECT_NAME, O.OBJECT_TYPE, SUM(TCH) TOUCHTIME
FROM X$BH B, DBA_OBJECTS O
WHERE B.OBJ = O.DATA_OBJECT_ID
AND B.TS# > 0
GROUP BY O.OWNER, O.OBJECT_NAME, O.OBJECT_TYPE
ORDER BY SUM(TCH) DESC)
WHERE ROWNUM <= 10
--或者
SELECT E.OWNER, E.SEGMENT_NAME, E.SEGMENT_TYPE
FROM DBA_EXTENTS E,
(SELECT *
FROM (SELECT ADDR, TS#, FILE#, DBARFIL, DBABLK, TCH
FROM X$BH
ORDER BY TCH DESC)
WHERE ROWNUM < 11) B
WHERE E.RELATIVE_FNO = B.DBARFIL
AND E.BLOCK_ID <= B.DBABLK
AND E.BLOCK_ID + E.BLOCKS > B.DBABLK
直接查找热点块操做语句 SELECT /*+rule*/ HASH_VALUE, SQL_TEXT FROM V$SQLTEXT
WHERE (HASH_VALUE, ADDRESS) IN (SELECT A.HASH_VALUE, A.ADDRESS
FROM V$SQLTEXT A,
(SELECT DISTINCT A.OWNER, A.SEGMENT_NAME, A.SEGMENT_TYPE FROM DBA_EXTENTS A,
(SELECT DBARFIL, DBABLK
FROM (SELECT DBARFIL, DBABLK FROM X$BH
ORDER BY TCH DESC) WHERE ROWNUM < 11) B
WHERE A.RELATIVE_FNO = B.DBARFIL
AND A.BLOCK_ID <= B.DBABLK
AND A.BLOCK_ID + A.BLOCKS > B.DBABLK) B
WHERE A.SQL_TEXT LIKE '%' || B.SEGMENT_NAME || '%' AND B.SEGMENT_TYPE = 'TABLE') ORDER BY HASH_VALUE, ADDRESS, PIECE; |
其它一些官方或英文资料:
Solutions
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.
WAITEVENT: "read by other session" Reference Note (文档 ID 732891.1)
Reducing waits typically involves application tuning and/or IO tuning.
Contention does not mean that there is necessarily a problem, but it is more likely that selects against the objects involved are reading more blocks than they have to. These unnecessary reads can then contend. To find such selects, look for the queries that are waiting frequently for 'read by other session'. Active Session History (ASH) reports during the period where contention is seen are a useful source of this sort of information. Alternatively look for those queries that read a lot of buffers when querying these tables; it is possible that these queries are poorly optimized and perhaps a different access path may read fewer buffers and cause less contention.
eg: if lots of sessions scan the same unselective index this can show as "read by other session" waits for "data blocks":
· the first session processes the blocks that are in the buffer cache quickly but then a block has to be read from disk
· the other sessions (scanning the same index) quickly 'catch up' and want the block which is currently being read from disk - they wait for the buffer as someone is already reading the block in.
Since the 'read by other session' wait event is an indicator that the buffers being waited for are popular (and are being "read by another session"), if queries are properly optimized, then an undersized buffer cache may mean that there is insufficient space to retain all the buffers required by queries. Make sure that the buffer cache is adequately sized to keep the buffers required by the current SQL statements from being aged out.
Resolving Issues Where 'read by other session' Waits When I/O is Slow (文档 ID 1477229.1)
Reducing Number of Waits:
参考资料:
http://www.xifenfei.com/2011/07/read-by-other-session%E7%AD%89%E5%BE%85%E4%BA%8B%E4%BB%B6.html
https://docs.oracle.com/database/121/REFRN/GUID-DCEB3FA4-57A9-4EBE-A349-BBCA1BA49281.htm#REFRN00610
http://www.dbdream.com.cn/2015/01/%E5%85%B3%E4%BA%8Eread-by-other-session%EF%BC%8Cdb-file-scattered-read%EF%BC%8Cdb-file-sequential-read%E7%AD%89%E5%BE%85%E6%97%B6%E9%97%B4%E7%9A%84%E4%BC%98%E5%8C%96/