とあるバッチで、OracleDBから複雑なクエリで5000万件ほどデータを取得する部分が長時間処理になっていて問題になっていた。
実行計画をあれこれ解析しても特に改善せず、お手上げかと思っていたが、
バッチの実行ログをみるとクエリの実行には時間がかかっておらず、
その後のフェッチで時間がかかっていることが判明。
なんだよ、実行計画解析意味なかったじゃねーかよ、と思いつつ、
フェッチに時間かかっているなら5000万件だしどうしょうもないかな・・?
と思いつつ、ふとフェッチサイズが気になって調査したところ、JDBCのデフォルトで10に設定されていたことが判明
10!?
試しに、この値を100に上げたところ圧倒的に速度改善!(数時間→数十分)
その後、1000にしたところ10分ちょいにまで改善。
そりゃそうだよね。
フェッチサイズ10ということは、5000万件のデータを取得するのに500万回DBサーバにアクセスしてるんだもんね。1回あたり数ミリ秒でも数百分だよね。。
フェッチサイズ100なら50万回だから450万回も減るよね(1000なら5万回・・)。
もちろん、1回あたりの取得データ量は増えるから1/10にはならないけど、1回のアクセスごとに固定でかかる時間ってそりゃきっとあるよね。
「大量データ取得処理が遅い=実行計画改善が必要!」というのが固定観念だったと思い知った、いつだかの思い出。
ただし、フェッチサイズを上げすぎるとOracle側での大量メモリ確保が必要になるらしいので注意。