系统遇到read by other session等待事件

今天用户反应系统很慢,做了一个AWR发现有大量read by other session等待事件,伴有大量的db file sequential read的等待事件:

read by other session等待事件说明:

当我们请求一个数据时,Oracle 第一次会从磁盘将数据读入buffer cache。如果有两个或者多个session 请求相同的信息,那么第一个session 会将这个信息读入buffer cache,其他的session 就会出现等待。 在10g之前,该等待事件还是在bufferbusy waits 之下,在Oracle 10g之后,单独将该事件拿出并命名为read by other session。一般来说出现这种等待事件是因为多个进程重复的读取相同的blocks,比如一些session 扫描相同的index或者在相同的block上执行full table scan。解决这个等待事件最好是找到并优化相关的SQL语句。Readby other session 等待的出现也说明数据库存在读的竞争,所以该等待事件通常和db file sequential read或db file scattered read 同时出现。

解决方法:

    1. 通过awr找出相应的sql,进行优化。
    2. 查看对应SQL的执行计划是否最优,必要时可以通过DBMS_SQLTUNE包进行优化,通过SQL_PROFILE文件稳固执行计划。
    3. 查看表和索引的统计信息是否陈旧,必要时收集统计信息。
    4. 调整pctfree参数,将数据重新导入,打散热块。

以下内容是参考 惜分飞 博客内容:http://www.xifenfei.com/1200.html

1.如果系统中有这种等待事件,我们可以通过以下SQL查询v$session_wait得到详细信息

SELECT p1 "file#", p2 "block#", p3 "class#"
  FROM v$session_wait
 WHERE event = ‘read by other session‘;

2.根据FILE#,BLOCK#查询热块对象,其实这部分可以直接从AWR的Segments by Buffer Busy Waits看出来。

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;

3.可以通过下面的SQL脚本查询到具体的SQL语句.

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;

Oracle说产生此等待事件大部分原因是多次全扫描相同的索引或在同一表上多次全表扫描。

eygle对db file scattered read的解释是:

db file scattered read通常显示与全表扫描相关的等待。当数据库进行全表扫描时,基于性能的考虑,数据会分散(scattered)读入Buffer Cache。如果这个等待事件比较显著,可能说明对于某些全表扫描的表,没有创建索引或者没有创建合适的索引。

db file sequential read通常显示与单个数据块相关的读取操作(如索引读取)。如果这个等待事件比较显著,可能表示在多表连接中,表的连接顺序存在问题,可能没有正确的使用驱动表;或者可能说明不加选择地进行索引。

在大多数情况下我们说,通过索引可以更为快速的获取记录,所以对于一个编码规范、调整良好的数据库,这个等待很大是很正常的。但是在很多情况下,使用索引并不是最佳的选择,比如读取较大表中大量的数据,全表扫描可能会明显快于索引扫描,所以在开发中我们就应该注意,对于这样的查询应该进行避免使用索引扫描。

时间: 2024-07-31 01:14:30

系统遇到read by other session等待事件的相关文章

判断目前系统中的等待事件

判断目前系统中的等待事件: SELECT SUBSTR(s1.username,1,12) "WAITING USER" , SUBSTR(s1.osuser,1,8) "OS User" , SUBSTR(TO_CHAR(w.session_id),1,5) "Sid" , p1.spid "PID" , SUBSTR(s2.username,1,12) "HOLDING User" , SUBSTR(s

【翻译自mos文章】找到&#39;cursor: pin S wait on X&#39; 等待事件的阻塞者session(即:持有者session)

找到'cursor: pin S wait on X' 等待事件的阻塞者session(即:持有者session) 来源于: How to Determine the Blocking Session for Event: 'cursor: pin S wait on X' (Doc ID 786507.1) 适用于: Oracle Database - Enterprise Edition - Version 10.2.0.1 to 11.2.0.3 [Release 10.2 to 11.2

查看历史会话等待事件对应的session信息

此处以enq: TX - row lock contention等待时间为例. 如果在此回话发生在awr快照信息默认的保存天数以内.可以通过如下sql查询到相关的session信息.select * from DBA_HIST_ACTIVE_SESS_HISTORY where event like '%enq: TX - row lock contention%' DBA_HIST_ACTIVE_SESS_HISTORY 中的blocking_session字段关联DBA_HIST_ACTIV

Oracle local write wait等待事件

Note 1: TypicallyDBWR has to free up some buffers when you want to read something from the disk.During this process there are chances that you will be waiting for your local buffer(i.e blocks dirtied/invalidated by your session) to be written to disk

SQL SERVER中的OLEDB等待事件

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

truncate表hang住(等待时间较长),出现enq:RO fast object reuse等待事件

有一个应用truncate表等待了一晚上,一个定时任务,跑了几年了,今天早上来发现昨晚没有执行完成,hang住了,查询发现等待事件 fast object reuse. 10.2.0.4的库 Bug 7385253 - Slow Truncate / DBWR uses high CPU / CKPT blocks on RO enqueue (文档 ID 7385253.8) Bug 9761199 - PMON hang on 'enq: ro - fast object reuse' (文

【等待事件】等待事件系列(5.1)--Enqueue(队列等待)

[等待事件]等待事件系列(5.1)--Enqueue(队列等待)   1  BLOG文档结构图   2  前言部分   2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① Enqueue队列等待 ② Enq数据字典 ③ enq: AE - lock ④ enq: MR锁 ⑤ enq: DX - contention ⑥ enq: SQ - contention 序列等待     2.2  相关参考文章链接 [推

Oracle常见的几种等待事件

1. CPU time 正常情况,在等待事件中排首位 NUM_CPU_SOCKETS    物理CPU的数目 NUM_CPU_CORES       CPU的核数 NUM_CPUS                  逻辑CPU的数目 2. Buffer busy waits (Buffer busy wait / read by other session) 一般这2个等待事件可以归为一起处理,建议进行监控 . 可能是如下操作引起 select/select --- read by other

ORACLE等待事件:enq: TX - row lock contention

enq: TX - row lock contention等待事件,这个是数据库里面一个比较常见的等待事件.enq是enqueue的缩写,它是一种保护共享资源的锁定机制,一个排队机制,先进先出(FIFO).enq: TX - row lock contention等待事件,OACLE将其归类为application级别的等待事件.有些场景是因为应用逻辑设计不合理造成的.下面我们看看enq: TX - row lock contention的英文介绍: This wait indicates ti