サービス業で働く社内SEのブログ

技術メモを適当にかいつまんで記載します

【Oracle】ダイレクトパスリード (Direct Path Read) について

ダイレクトパスリードとはバッファキャッシュを経由しないSELECTの事。
この事から直接ストレージからデータを引っ張ってくるため
当然ながらDBサーバのI/Oは高くなります。

これはパラレルクエリを使用した場合になりやすく
またチューニング・速度改善の観点としてパラレルクエリで小さいテーブルを処理させる場合は
バッファキャッシュ上に十分データをキャッシュする事も出来るため
かえって遅くなる事もあります。

逆に大規模なテーブルに対してのパラレルクエリは
そもそもバッファキャッシュキープ出来きない事が懸念される(キャッシュできるデータ量を超えている事が多いため)ため
I/Oを発生させてでもパラレル化し
ダイレクトパスリードさせる事をおすすめします。

尚、パラレルクエリのバッファキャッシュキープが出来ない件ですが
Oracle11gからは、インメモリパラレルクエリ(In-Memory Parallel Query)の設定が出来るため
パラレルでもバッファキャッシュを用いる事が出来ます。
ただしインメモリパラレルクエリには注意点があって
この機能を有効化する場合は
・自動パラレル度決定
・パラレルキューイング
も同時に設定されてしまいます。
特にチューニング・速度改善の観点からはパラレルキューイングが厄介で
要するにSQLが発行されたタイミングで十分なパラレルサーバが無い場合はキューに入れられて
条件が満たされた時にはじめてデキューされる事(このタイミングで処理される)
により返って遅くなってしまう場合もあります。