- PR -

JDBCのDB接続でのResuletSet#next()の速度について

1
投稿者投稿内容
POTETO
常連さん
会議室デビュー日: 2003/10/06
投稿数: 41
投稿日時: 2004-05-17 05:35
こんにちは、

JDK1.3で、DBはSQLServer2000です。
数千(万)件のデータをCSV形式で出力するために
動的なSQLをStatementクラスで実行しResultSetを受け取っているのでが、
next()メソッド実行に時間がかかりすぎているようです。
1000レコード程度でも1分ほどかかっています。(Select句で指定している
カラム数が1でも100でも変わりませんでした。)
Statement#setFetchSizeでフェッチサイズを大きくしても
1度にバッファできるレコード数が増えるだけで、
1度のnext()メソッド発行時にかかる時間が多くなり
結局1分ほどかかってしまいます。
googleなどで検索しても、Oracleドライバの場合は何か設定できる
パラメータがあるらしいのですが、直接JDBCのAPIを使った場合の
改善方法やSQLServerのJDBCドライバのクラスを使った対処法が
見つけられませんでした。
何か、ご存知の方は助言をよろしくお願いします。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-05-17 12:16
まず確認ですが、JavaプログラムからではなくクエリアナライザからそのSQLを実行した場合
には、問題ないパフォーマンスで動くのでしょうか。

またSQLServer用のJDBCドライバには何を使っているのでしょうか。まさかJDBC/ODBCでは
ないだろうと思いますが。
POTETO
常連さん
会議室デビュー日: 2003/10/06
投稿数: 41
投稿日時: 2004-05-17 12:50
ukさん、
返信ありがとうございます。

クエリアナライザで実行すると2秒ぐらいで結果が出力されます。
JDBCドライバは、
http://www.microsoft.com/japan/msdn/sqlserver/downloads/jdbc/
からダウンロードした、Microsoft SQL Server 2000 Driver for JDBCです。
おがわ
大ベテラン
会議室デビュー日: 2001/08/01
投稿数: 199
お住まい・勤務地: 千葉県
投稿日時: 2004-05-21 03:55
[プログラミングからの観点]
java.sql.Statementとjava.sql.PreparedStatementでのSQL実行パフォーマンスは全然違います。
1000程度の件数でしたら、その差を感知できるかもしれません。
可能な限り、java.sql.Statementを使用するのはやめましょう。

[ネットワーク上の観点]
同一ホスト間のループバック通信ですか、それとも、異なるホスト間同士の通信ですか?
異なるホスト間同士で通信する場合、ネットワークの混雑具合により、多少時間がかかる可能性もあると思います。
せい
会議室デビュー日: 2003/10/29
投稿数: 10
投稿日時: 2004-05-21 12:43
URLはどのように設定されていますでしょうか?
SelectMethodとか。
POTETO
常連さん
会議室デビュー日: 2003/10/06
投稿数: 41
投稿日時: 2004-05-24 02:58
SuperCreekさん、せいさん、
返信ありがとうございます。

確かにPreparedStatementを使いたいところなのですが、
抽出する対象(SELECT句)や条件句が動的に変わる自由検索が必要なので
(今思えばこんなSQLが必要になるもの作らなければ良かったのですが)
PreparedStatementは使いずらいです。

SelectMethodはcursorです。

いろいろお騒がせしましたが、SQLでJOINする条件列が主キーでなかったために
JOINで時間がかかっていたようです。結合条件列にインデックスを張ると
30倍くらい早くなりました。更新速度への影響もあまり見られなかったので
この対処でいこうと思います。
主キー以外で結合しないといけないDBの設計にも問題があったようです
良い勉強になりました。
1

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