- PR -

ResultSetの中身について、またResultSetの中身を高速に取得する方法は?

1
投稿者投稿内容
くえるぼ
会議室デビュー日: 2004/12/15
投稿数: 16
投稿日時: 2005-11-09 00:12
現在、Oracleに接続し、そこから数十万件のレコードを取得して、
データを行列形式に整形するプログラムを構築しております。

そこで、諸先輩方にお聞きしたいこととして、
Oracleからデータを取得してくるときに、SQL分をexecuteQueryし、
結果をResultSetオブジェクトに格納しています。

Q1.ResultSetの中身はどうなっているのでしょうか?

executeQueryの結果を受け取るResultSetオブジェクトですが、
その中身は、該当するレコード全件がResultSet変数内に
格納されているのか、または該当するレコードが存在する
ディスク上のポインタだけが格納されているのか
どちらなのか気になっています。
どのような仕様になっているのかご教授いただければ幸いです。
(この質問は次のQ2に関係しています)

Q2.ResultSetの中身を高速に取得する方法は?

現在取得しているResultSetはレコード件数が数十万件
にもわたるようなレコードとなっており、
ヒットしたレコードを全件なめ、そのデータを行列形式に
整形するだけでも、かなりの処理時間(数分程度)が必要に
なっており、どうにか高速化出来ないかと思案しております。

インターネット上の情報や書籍などには、PreFetchサイズを
変更すると高速化に寄与することがあると書いてありましたが、
PreFetchサイズを多少変えてみても、まったくレスポンスの向上は
見られません。

ここでQ1の質問内容と関連してくるのですが、そもそもResultSet内に
該当するレコード全件のデータをオンメモリで保持しているならば
Prefetchサイズなどは関係ないのかなと思っています。
ただし、ResultSet内の情報がポインター+Prefetchサイズで指定した
レコードの情報という形になっているのであれば、メモリサイズが
許す限りのサイズをとってきた方が高速に処理できそうな気がしています。
ResultSetを高速に取得するためのセオリーや方法などがありましたら、
こちらもご教授いただければと思います。










[ メッセージ編集済み 編集者: JAVAビギナー(+_+) 編集日時 2005-11-09 00:12 ]

[ メッセージ編集済み 編集者: JAVAビギナー(+_+) 編集日時 2005-11-09 09:17 ]
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-11-09 01:50
A1.
ResultSetはあくまでインターフェイスであり、
内部的にどのような挙動を採るのかは、ドライバの実装次第です。

A2.
Connection#createStatementの引数で、ResultSetの定数を指定することにより、
作成されたStatementによって得られるResultSetの挙動を変えることができます。
(これもドライバがJDBCの仕様の通りに実装されていればの話です)

参考程度かもしれませんが、
以前にかなりな件数のSELECTで使用したときには、
・ResultSet#CONCUR_READ_ONLY
・ResultSet#TYPE_FORWARD_ONLY
を指定しましたが、そこそこ速かった覚えがあります。

また、プログラムのボトルネックがデータベース接続だけなのかも
確認してみるといいと思います。
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2005-11-09 09:27
もっと速いのはそのプログラムをJavaストアドプロシージャーとしてOracleで実行させることですかね。
武澤
常連さん
会議室デビュー日: 2004/09/27
投稿数: 31
投稿日時: 2005-11-09 17:31
Q2.ResultSetの中身を高速に取得する方法は?
 DB側のSQLが最適なっているという状況なら、フェッチサイズを調整すればかなり早く
なります。(考慮する点はメモリ量、ネットワーク帯域などです。)
 この辺については、大体どのDBでも同じかと思いますので、OracleのJDBC開発ガイドに
記載されていますので、まずは、読んでみてはいかがでしょうか?

キーワードはフェッチサイズ、ラウンドトリップです。
武澤
常連さん
会議室デビュー日: 2004/09/27
投稿数: 31
投稿日時: 2005-11-09 17:34
あっ、途中で送信してしまったので補足します。

ラウンドトリップを理解すれば、ResultSetにはどのようにDBから行データが渡ってくる
のか?も理解できると思いますので、おのずと「Q1.ResultSetの中身はどうなっているの
でしょうか? 」も理解できるかと思います。
くえるぼ
会議室デビュー日: 2004/12/15
投稿数: 16
投稿日時: 2005-11-16 13:27
JAVAビギナーです。
みなさま丁寧なアドバイス誠にありがとうございました。
頂きました情報を元にまた勉強して、今後に生かしていきたいと
思います。

ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)