2017-02-01 12 views
0

私は約100万行を処理するためにメモリに効率的にロードする必要がある場合があります。私はこれを行うためにOracleとプレーンJDBCを使用しています。Oracle JDBCで大きな結果セットを使用すると、カーソルのフェッチをオフにできますか? (フェッチサイズの問題)

フェッチ・サイズを設定しない場合、oracleドライバのデフォルトは10です。つまり、100kラウンドトリップが必要となり、パフォーマンスが非常に悪くなります。フェッチサイズを500kや1mなどの非常に大きなものにすると、データは約5秒で読み込まれます。

残念ながら、フェッチサイズは、Oracleドライバがフェッチサイズに基づいてバッファを事前に割り当てているため、INT_MAXのような値に設定することはできません。

私が本当に欲しいのは、JDBCにすべての行を取得させ、カーソルを使用せず、インクリメンタルなフェッチを実行させることです。私は可能な限り最も効率的な方法でそれをしたいと思います。

オラクルにすべてのデータを取得させてフェッチしないように指示する方法はありますか?

+3

これはおそらく悪い考えです。あなたは、巨大なレコードセットをサーバー側に持ってきて、処理して戻す必要があると誤って考えるのは初めてです。小さいチャンクサイズをコミットするか、データベースサーバー自体で処理することを検討してください。 – duffymo

+0

私は間違いなくデータベースの処理を試みることをお勧めします。 – BobC

+0

私の経験では、フェッチサイズを大幅に大きく設定しました。 10000はパフォーマンスを改善しません。私はあなたが500kを超えた場合、パフォーマンスの大幅な向上に気付くでしょう(2百万回のスピードで5秒以上かかるでしょうか?)。結果セットをメモリに保存することを忘れないでください。** 2回**(ドライバとアプリケーション) –

答えて

1

12ドライバは、ブックキーピングのフェッチサイズと実際のデータサイズに1行につき15バイトを割り当てます。したがって、フェッチサイズを1Gに設定すると、12ドライバは実際のデータが何であれ、簿記に15GBを割り当てます。したがって、どれくらいのメモリがあるかによって、フェッチサイズをサポートするメモリがあるものに設定できます。

12より多くのメモリが割り当てられているので、フェッチサイズははるかに小さくなければなりません。

ドライバに1回の往復ですべての行をフェッチするように指示する方法はありません。

編集2017-03-10:最大2G行のテストを行い、最近リリースされた12.2ドライバはこの罰金をFORWARD_ONLY結果セットで処理します。彼らはSCROLL_INSENSITIVE結果セットを持つ1,802,723,000行まで処理します。それが期待される限界です。明らかに、これは巨大なマシンとginormousヒープです。

関連する問題