スキップしてメイン コンテンツに移動

11gR2からのフルスキャン

従来からフルスキャン(通常 db file scattered read)をバッファーキャッシュを迂回するdirect path readに変更する手法としていくつか手段がありました。

* 今回は、Parallel Queryは除外

1. "_serial_direct_read"を設定する

SQL> alter session set "_serial_direct_read"=true;

2. event 10355を設定

$ oerr ora 10355
10355, 00000, "turn on direct read path for scans"
// *Cause:
// *Action:  enable direct async read for scans

11gR2からは、フルスキャンでdb file scattered readを使うのか、direct path readを使うのか、Oracleが自動で決定しているようです。
勝手に選択されるのも、時と場合によっては問題になる可能性があるので、その仕組みを少し調査してみます。

以下の隠しパラメータが影響して、I/Oの制御を行っているようです。

"_small_table_threshold"
lower threshold level of table size for direct reads

"_very_large_object_threshold"
upper threshold level of object size for direct reads

セグメントサイズ > 5 * "_small_table_threshold" * blocksizeの場合にdirect path readを選択するようになります。

ただし、これは、event 10949で制御が可能です。

$ oerr ora 10949
10949, 00000, "Disable autotune direct path read for full table scan"
// *Cause:
// *Action:  Disable autotune direct path read for serial full table scan.

しかし、event 10949でDisableにしても

セグメントサイズ > "_very_large_object_threshold" (MB)の場合は、Disableにされません。

つまり

どうしてもdirect path readを選択したくない場合は、

1. 10949でdirect path readをdisableに設定する
さらに
2. "_very_large_object_threshold"を大きな値に設定する

* ただし、隠しパラメータですので、ご使用とご用法には注意してください。

コメント