read by other session 等待事件是10g从buffer busy waits中分离出的一个等待事件之一,当一个会话需要访问的数据块正在被其他会话从磁盘上向 buffer cache写入时,就会等待read by other session;

      这个等待事件一般是因为多个会话对相同的一些数据块不停的重复读取引起的,例如多个会话访问同一个索引或多个会话对同一张表进行全表扫描。

本例中就是因为执行计划不正确导致的多个会话对同样的表格(分区)进行全表扫描。

一 、现象

1、业务受到严重影响

2、操作系CPU资源非常紧张

3、数据库中存在大量read by other session 等待事件,且等待该事件的多个会话正在执行相同sql。

二、解决过程

1、获取到频繁发生read by other session 的sql_id

2、根据sql_Id获取所有的child_number

select sql_id,child_number from v$sql where sql_id=’312wbxsuqgbjd’;

3、获取执行计划

select * from table(dbms_xplan.display_cursor(‘312wbxsuqgbjd’,1,’ADVANCED’));  –’ADVANCED’会显示绑定变量的值

执行计划显示该语句对表格的一个分区(201305)进行全部扫描

4、检查表格的统计信息,发现201305分区的统计信息是0行数据,发生问题是5月2日,这时201305分区已经有40万的数据。

5、手工收集统计信息

exec dbms_stats.gather_table_stats(ownname=>’AAA,tabname=>TABLE_NAME’,PARTNAME=>TABLE_NAME_201305′);

6、执行计划恢复正常(使用索引)