最近問題が発生しました。Oracle DBからバッチでデータのテーブルを取得したかったのですが、バッチはたとえば4〜5000です。私の以前の「一般的な」解決策は、selectを次のようなものにラップすることでした。
SELECT * FROM (
SELECT ROWNUM AS RN, INNERSELECT.* FROM (
select THINGS1, THINGS2 from MYTABLE)
)
INNERSELECT WHERE ROWNUM < 4001) WHERE RN >= 3001
rownumの境界が高い場合(たとえば、4-500.000)、選択に10〜20秒以上かかるため、遅いように見えます。そして、値を増やすにつれて、時間は直線的に増加しています。もちろん、その理由はわかっているので、データをバッチで取得するための別のソリューションを見つけたいと思いましたが、時間枠は保証されていました。それで、私はこの種の選択を使用しました:
SELECT * FROM (
SELECT INNERSELECT.*, ROW_NUMBER() OVER (ORDER BY INNERSELECT.ROWID) RN FROM
( select THINGS1, THINGS2 from MYTABLE)
INNERSELECT
) WHERE RN BETWEEN 3001 AND 4000;
これは少し遅いですが(テスト用のデータのバッチを取得するのに3〜4秒かかりました)、パフォーマンスの低下を目立たせることなくバッチサイズを増やすことができ、高い値でも同じになります。現在の問題は、DBから複数のスレッドの複数のテーブルから選択し、3つのスレッドを使用するとパフォーマンスが低下することです(現在プロジェクトで使用されている16については説明していません)。JDBC接続はプールされ、パフォーマンスの低下はサーバー側にあります。選択がCPU時間を消費しているので、私は何もできないことは明らかだと思いますが、これを最適化するためのヒントを皆さんに知ってもらいたいと思います。
もう1つの問題は、使用するツールがプロジェクト固有ではなく、可能な限り一般的である必要があるため、たとえばコピーテーブルなどを使用できないことです。
事前に回答ありがとうございます