ITPub博客

首页 > 数据库 > Oracle > read by other session等待事件

read by other session等待事件

Oracle 作者:ericwen2015 时间:2017-08-30 17:37:01 0 删除 编辑

这个等待时间今天碰到,回忆了一下这个等待事件的原理
和解决思路并总结一下。

 

[plain] view plain copy
 print?
  1. read by other session Definition: 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.  
  2.  In previous versions this wait was classified under the “buffer busy waits” event.  
  3.  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.  
  4.  Confio concludes with a summary that “read by other session waits” are very similar to buffer busy waits  
  5.  When a session waits on the “read by other session” event, it indicates a wait for another session to read the data from disk into the Oracle buffer cache.  
  6.  If this happens too often the performance of the query or the entire database can suffer. Typically this is caused by contention for “hot” blocks or objects so it is imperative to find out which data is being contended for. Once that is known this document lists several alternative methods for solving the issue  


这个等待事件其实是Oracle IO问题一个比较尴尬的场景,会话a在进行把磁盘上的数据块读到内存(data buffer cache)中这个操作,
会话b,会话c 同时也请求这个数据块。因为会话a还完全读入内存(data buffer cache),就导致了b,c read by other session
所以会话a一般是db file sequential read  或 db file scattered read。
这个是oracle 10g 从oracle 9i的buffer busy waits中分离出来的,也是一种热块现象.

[sql] view plain copy
 print?
  1. SQL> col name for a40  
  2. SQL> col PARAMETER1 for a15  
  3. SQL> col PARAMETER2 for a15  
  4. SQL> col PARAMETER3 for a15  
  5. SQL> col WAIT_CLASS for a30  
  6.   
  7. SQL> select name,PARAMETER1,PARAMETER2,PARAMETER3,WAIT_CLASS from v$event_name where name like '%db file s%';  
  8.   
  9. NAME                                     PARAMETER1      PARAMETER2      PARAMETER3      WAIT_CLASS  
  10. ---------------------------------------- --------------- --------------- --------------- ------------------------------  
  11. db file sequential read                  file#           block#          blocks          User I/O  
  12. db file scattered read                   file#           block#          blocks          User I/O  
  13. db file single write                     file#           block#          blocks          User I/O  


 

我们看到p1,p2 为文件号和块号。就可以根据此等待事件查到是那个文件的那个块在等待,如果此等待事件在awr的top n的话,需要关注了。

可以根据下面的sql 来定位表名和拥有者。

[sql] view plain copy
 print?
  1. SELECT OWNER, SEGMENT_NAME, SEGMENT_TYPE, TABLESPACE_NAME, A.PARTITION_NAME  
  2.  FROM DBA_EXTENTS A  
  3.  WHERE FILE_ID = &FILE_ID  
  4.  AND &BLOCK_ID BETWEEN BLOCK_ID AND BLOCK_ID + BLOCKS – 1;  


通过这个对象查询出对应的操作语句 通过这个对象查询出对应的操作语句

[sql] view plain copy
 print?
  1. select * from v$sql where upper(sql_text) like ‘%object_name%’;  


 

在同一时间,系统中如果伴随大量的 db file sequential read  或 db file scattered read ,对于此read by other session 的快速定位
造事会话 起到了阻碍作用。这个快速定位的方法还是awr。但是这个实效性不高。还是需要写实时脚本来监控。脚本内sql方法思路是:
找到db file sequential read  或 db file scattered read的会话。根据这个找到他们的sql。根据这个sql 里面的表,来和上述 根据热块的表对比,如果是一样
就是这个造事会话了。
如果情况紧急,影响到生产。并且造势会话可以kill,还是kill 来得快。

 

[sql] view plain copy
 print?
  1. ---查询热块对象sql语句:  
  2. SELECT *  
  3.   FROM (SELECT O.OWNER, O.OBJECT_NAME, O.OBJECT_TYPE, SUM(TCH) TOUCHTIME,  
  4.           FROM X$BH B, DBA_OBJECTS O  
  5.          WHERE B.OBJ = O.DATA_OBJECT_ID  
  6.            AND B.TS# > 0  
  7.          GROUP BY O.OWNER, O.OBJECT_NAME, O.OBJECT_TYPE  
  8.          ORDER BY SUM(TCH) DESC)  
  9.  WHERE ROWNUM <= 10   
  10.    
  11.    
  12. --查找热点块操作语句  
  13.  SELECT /*+rule*/  
  14.  HASH_VALUE, SQL_TEXT  
  15.   FROM V$SQLTEXT  
  16.  WHERE (HASH_VALUE, ADDRESS) IN  
  17.        (SELECT A.HASH_VALUE, A.ADDRESS  
  18.           FROM V$SQLTEXT A,  
  19.                (SELECT DISTINCT A.OWNER, A.SEGMENT_NAME, A.SEGMENT_TYPE  
  20.                   FROM DBA_EXTENTS A,  
  21.                        (SELECT DBARFIL, DBABLK  
  22.                           FROM (SELECT DBARFIL, DBABLK  
  23.                                   FROM X$BH  
  24.                                  ORDER BY TCH DESC)  
  25.                          WHERE ROWNUM < 11) B  
  26.                  WHERE A.RELATIVE_FNO = B.DBARFIL  
  27.                    AND A.BLOCK_ID <= B.DBABLK  
  28.                    AND A.BLOCK_ID + A.BLOCKS > B.DBABLK) B  
  29.          WHERE A.SQL_TEXT LIKE '%' || B.SEGMENT_NAME || '%'  
  30.            AND B.SEGMENT_TYPE = 'TABLE')  
  31.  ORDER BY HASH_VALUE, ADDRESS, PIECE; 

原文:http://blog.csdn.net/kelly1984/article/details/8179506

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30373825/viewspace-2144340/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2015-07-26

  • 博文量
    41
  • 访问量
    24975