パフォーマンス・チューニングのお仕事をさせて頂くことがあります。その時に、待機イベントの
- db_file_sequential_read
- db_file_scattered_read
がいつもごちゃごちゃになるので備忘録として記載します。
db_file_sequential_readとは
索引スキャンなどを行った時に発生する待機イベント。一応は、インデックスが利用されるときに発生する。『順次読み込み』なので、ディスクからがさっと持ってくるようなイメージを持つが、ここで言うreadは、メモリにローディングした後の動作を指すため、『綺麗にバッファ上に展開し、その上で順番にアクセスしていく』というような意味らしい。
注2:待機イベント名には「sequential(シーケンシャル)」と書いてありますが、実質的にはランダムI/Oです。 Oracleにおける、いわゆるシーケンシャル(順次)I/Oは「db file scattered read」です。
http://www.oracle.com/technetwork/jp/articles/chapter1-1-085735-ja.html
scatter_readと異なり、indexが不足しているということは無い。ただ、ディスクアクセスが多発している以上、メモリが十分に使えていない可能性もある。scatter_readが発生し、バッファメモリを無駄遣いしないように見なおせば、メモリ上に残ったバッファを利用出来るようになり、アクセスが改善することもあります。
db_file_scattered_readとは
全表スキャン(Table Access Full)などを行ったときに発生する待機イベント。データベースがレコードを取得する際に、『indexを利用するよりも一旦これは全て読み込んだほうが早いなあ』と判断する際に発生。基本的にこいつを見つけたら、indexが不足している可能性があるので、
- indexを追加する
- indexを利用できるような検索条件にする
といった対応が必要になります。
11gR2以降は、direct_path_readにも注意
direct_path_readとは、読み込んだ結果をキャッシュメモリに保管せずに参照する検索方法。例えば、月に1回しか動かない大量データを読み込むような処理であれば、再度参照される可能性も低く、メモリに格納する価値は低い。
11gR2以前は、パラレルクエリで実行した際などに利用されていたが、11gR2以降は通常のselect文でも、オラクルの判断で実行される。バッファメモリを無駄遣いせずエコだし、ドでかいデータを扱わざるを得ない処理だから仕方ない場合も多いが、通常利用される処理の中で発生しないかどうか位は、確認したほうが良いかも知れません。