- - PR -
JDBCのDB接続でのResuletSet#next()の速度について
1
| 投稿者 | 投稿内容 |
|---|---|
|
投稿日時: 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ドライバのクラスを使った対処法が 見つけられませんでした。 何か、ご存知の方は助言をよろしくお願いします。 |
|
投稿日時: 2004-05-17 12:16
まず確認ですが、JavaプログラムからではなくクエリアナライザからそのSQLを実行した場合
には、問題ないパフォーマンスで動くのでしょうか。 またSQLServer用のJDBCドライバには何を使っているのでしょうか。まさかJDBC/ODBCでは ないだろうと思いますが。 |
|
投稿日時: 2004-05-17 12:50
ukさん、
返信ありがとうございます。 クエリアナライザで実行すると2秒ぐらいで結果が出力されます。 JDBCドライバは、 http://www.microsoft.com/japan/msdn/sqlserver/downloads/jdbc/ からダウンロードした、Microsoft SQL Server 2000 Driver for JDBCです。 |
|
投稿日時: 2004-05-21 03:55
[プログラミングからの観点]
java.sql.Statementとjava.sql.PreparedStatementでのSQL実行パフォーマンスは全然違います。 1000程度の件数でしたら、その差を感知できるかもしれません。 可能な限り、java.sql.Statementを使用するのはやめましょう。 [ネットワーク上の観点] 同一ホスト間のループバック通信ですか、それとも、異なるホスト間同士の通信ですか? 異なるホスト間同士で通信する場合、ネットワークの混雑具合により、多少時間がかかる可能性もあると思います。 |
|
投稿日時: 2004-05-21 12:43
URLはどのように設定されていますでしょうか?
SelectMethodとか。 |
|
投稿日時: 2004-05-24 02:58
SuperCreekさん、せいさん、
返信ありがとうございます。 確かにPreparedStatementを使いたいところなのですが、 抽出する対象(SELECT句)や条件句が動的に変わる自由検索が必要なので (今思えばこんなSQLが必要になるもの作らなければ良かったのですが) PreparedStatementは使いずらいです。 SelectMethodはcursorです。 いろいろお騒がせしましたが、SQLでJOINする条件列が主キーでなかったために JOINで時間がかかっていたようです。結合条件列にインデックスを張ると 30倍くらい早くなりました。更新速度への影響もあまり見られなかったので この対処でいこうと思います。 主キー以外で結合しないといけないDBの設計にも問題があったようです 良い勉強になりました。 |
1
