read by other sessionとは

read by other sessionは物理読み込みしようとしたブロックが他セッションで読み込み中であった為待機した場合に発生する待機イベントです。 このイベントは10gから追加されており9iまではbuffer busy waits待機イベントとして発生していました。 この待機イベントが追加されたことで待機がI/O起因なのかpin等のロックの待機によるブロック競合であるのかの判別が可能になっています。


待機イベントパラメータ

p1・・・file#。ファイル番号。v$datafileのfile#に対応。
p2・・・block#。読み込み開始位置のブロック番号。
p3・・・class#。
file#とblock#から対象セグメントと参照ブロックのデータを以下のSQLより確認することができます。

file#=13、block#=654732、blocks=2であった場合の例
select owner, segment_name, segment_type, tablespace_name
from dba_extents
where file_id = 13
and 654732
between block_id and block_id + blocks - 1;

OWNER                        SEGMENT_NAME                 SEGMENT_TYPE                 TABLESPACE_NAME
---------------------------- ---------------------------- ---------------------------- ----------------------------
TEST                         B                            TABLE                        SSD1
⇒TESTスキーマのBというテーブルを参照していたことがわかる

select * from B 
where
 dbms_rowid.ROWID_RELATIVE_FNO(rowid) = 13 and
 dbms_rowid.ROWID_BLOCK_NUMBER(rowid) between 654732 and 654733;
⇒この待機イベント中に読み込んでいたブロックに格納されていたデータが表示される

対策

I/Oの複数セッション間のブロック競合が原因のため対策にはバッファキャッシュにキャッシュを載せI/O自体をなくしてしまうか、同じブロックを複数セッション間で読まなくする必要があります。 なお、行のブロック番号はdbms_rowid.ROWID_BLOCK_NUMBER(rowid)で取得することが可能なのでこれを利用して特定行同士が同じブロック内に存在しているか確認可能です。
★ORACLE案件承ります