従来からフルスキャン(通常 db file scattered read)をバッファーキャッシュを迂回するdirect path readに変更する手法としていくつか手段がありました。
* 今回は、Parallel Queryは除外
1. "_serial_direct_read"を設定する
2. event 10355を設定
11gR2からは、フルスキャンでdb file scattered readを使うのか、direct path readを使うのか、Oracleが自動で決定しているようです。
勝手に選択されるのも、時と場合によっては問題になる可能性があるので、その仕組みを少し調査してみます。
以下の隠しパラメータが影響して、I/Oの制御を行っているようです。
セグメントサイズ > 5 * "_small_table_threshold" * blocksizeの場合にdirect path readを選択するようになります。
ただし、これは、event 10949で制御が可能です。
しかし、event 10949でDisableにしても
セグメントサイズ > "_very_large_object_threshold" (MB)の場合は、Disableにされません。
つまり
どうしてもdirect path readを選択したくない場合は、
1. 10949でdirect path readをdisableに設定する
さらに
2. "_very_large_object_threshold"を大きな値に設定する
* ただし、隠しパラメータですので、ご使用とご用法には注意してください。
* 今回は、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"を大きな値に設定する
* ただし、隠しパラメータですので、ご使用とご用法には注意してください。
コメント
コメントを投稿