db file scattered readとは
db file scattered readは複数ブロックをDISKからバッファキャッシュへ読み込んだ場合に発生する待機イベントです。 db file scattered readで一度に読み込める最大ブロック数は初期化パラメータdb_file_multiblock_read_countで決められており、 多くのOSで1回のI/O最大サイズは1MBであることからブロックサイズ×db_file_multiblock_read_countが1MBになる設定が基本となります。 (ただし、db_file_multiblock_read_countの値を増加させるとFULL SCANの実行計画が選択されやすくなります)1回のdb file scattered readでの読み込みブロック数は2~db_file_multiblock_read_countまでの範囲で以下のような要因により読み込みブロック数が変わります。
・エクステント境界に達した
・読み込みが必要なブロックのうち、途中のブロックが既にキャッシュ上に存在していた
また、db file scattered readは複数のブロックを一度に読み込む場合の待機イベントなのでシングルブロックリードになる索引スキャン等では 基本的に発生しませんが、キャッシュのプリウォーム機能などの影響で索引スキャンにおいてもdb file scattered readは発生する場合があります。
待機イベントパラメータ
p1・・・file#。ファイル番号。v$datafileのfile#に対応。p2・・・block#。読み込み開始位置のブロック番号。
p3・・・blocks。読み込みブロック数。
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;⇒この待機イベント中に読み込んでいたブロックに格納されていたデータが表示される
対策
複数ブロックをDISKから読み込む場合に発生する待機イベントでどのようなシステムにおいても少なからず発生するイベントなので 待機時間が適切であるかどうかはこの待機イベントが多く発生しているSQLの実行計画が適切であるかどうかをまず確認する必要があります。上述の通りI/Oサイズを1MBにするのが最も性能が高くなるケースが多いのでdb_file_multiblock_read_countに増加の余地があれば 待機回数が減り待機時間が少なくなる可能性があります。