physical reads prefetch warmup

今更なネタですがメモ。
Oracle Database (10.1以降)でバッファキャッシュがスカスカの場合、アクセスパスが INDEX UNIQUE/RANGE SCAN でも db file scattered read でマルチブロックリードすることがある。
これはブロックにアクセスするついでに近くのブロックもそのうちアクセスされると予測してバッファキャッシュに乗せて、以降の処理を高速化する意図があると思われる。

まとめ

  • INDEX UNIQUE/RANGE SCAN などで db file sequential read でなく db file scattered read が発生している
  • SQLトレース、V$SQLSTATS、DBA_HIST_SQLSTAT などで、physical reads より logical reads が少ない(そのSQLで使わないブロックを physical read している)
  • V$SESSTAT、V$SYSSTAT、DBA_HIST_SYSSTAT などで以下の統計値がカウントアップされる
    • physical read total multi block requests: マルチブロックリードが発生している
    • physical reads cache prefetch: マルチブロックリードでプリフェッチが発生している
    • physical reads prefetch warmup: バッファキャッシュのウォームアップのため、マルチブロックリードでプリフェッチが発生している
  • _db_cache_pre_warm で制御できる