私は約100万行を処理するためにメモリに効率的にロードする必要がある場合があります。私はこれを行うためにOracleとプレーンJDBCを使用しています。Oracle JDBCで大きな結果セットを使用すると、カーソルのフェッチをオフにできますか? (フェッチサイズの問題)
フェッチ・サイズを設定しない場合、oracleドライバのデフォルトは10です。つまり、100kラウンドトリップが必要となり、パフォーマンスが非常に悪くなります。フェッチサイズを500kや1mなどの非常に大きなものにすると、データは約5秒で読み込まれます。
残念ながら、フェッチサイズは、Oracleドライバがフェッチサイズに基づいてバッファを事前に割り当てているため、INT_MAXのような値に設定することはできません。
私が本当に欲しいのは、JDBCにすべての行を取得させ、カーソルを使用せず、インクリメンタルなフェッチを実行させることです。私は可能な限り最も効率的な方法でそれをしたいと思います。
オラクルにすべてのデータを取得させてフェッチしないように指示する方法はありますか?
これはおそらく悪い考えです。あなたは、巨大なレコードセットをサーバー側に持ってきて、処理して戻す必要があると誤って考えるのは初めてです。小さいチャンクサイズをコミットするか、データベースサーバー自体で処理することを検討してください。 – duffymo
私は間違いなくデータベースの処理を試みることをお勧めします。 – BobC
私の経験では、フェッチサイズを大幅に大きく設定しました。 10000はパフォーマンスを改善しません。私はあなたが500kを超えた場合、パフォーマンスの大幅な向上に気付くでしょう(2百万回のスピードで5秒以上かかるでしょうか?)。結果セットをメモリに保存することを忘れないでください。** 2回**(ドライバとアプリケーション) –