- - PR -
セレクト文の最適化について
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-06-02 18:33
お世話になってます。
下記のように1回1回値を取得するSQLを、最適化したい(速度を上げたい)のですが、 どんな方法がありますでしょうか。 String sPrepareSQL = "SELECT aaa, bbb, ccc FROM S002 WHERE ssss = ?"; psSelS002_ = con_.prepareStatement(sPrepareSQL); psSelS002_.setString(1 , ssss_); rs = psSelS002_.executeQuery(); if(rs.next()){ aaa_ = rs.getString("aaa").trim(); bbb_ = rs.getString("bbb").trim(); ccc_ = rs.getString("ccc").trim(); } rs.close();rs = null; | ||||||||
|
投稿日時: 2006-06-02 18:59
SQLを一回発行して
取得できた1レコードを変数に格納していく。 とっても最小構成だと思うのですが、それで遅いと感じるような 速度なのでしょうか? ここでは書いていないだけで、 何度もこのSQLを発行して、他のレコードの値も取得している。。。? | ||||||||
|
投稿日時: 2006-06-02 19:06
データが1万件とかになると、1万回セレクトするので、
かなり時間がかかります。 他のレコードの値は取得していません | ||||||||
|
投稿日時: 2006-06-02 19:28
かなりというのはどれ位でしょうか? また、要求される処理時間は決まっていますか? 目標としている基準があれば提示したほうが良いと思います。 後は環境もですね。少なくともDBMSとそのバージョンはあったほうがベターでしょう。 | ||||||||
|
投稿日時: 2006-06-02 20:27
すみません。勘違いしてました。
SQL文の最適化じゃなくて、 このSELECT文は、一回実行すれば複数行とってこれるから、 それを配列に格納してDBアクセスを一回にしてほしいってこ とです。 | ||||||||
|
投稿日時: 2006-06-02 21:09
発行しているSELECT文で複数行のレコードが取得できているなら
rs.next()でどんどん次の行にアクセスしていけば良いのでは無いでしょうか? とりあえず↓を読んでみるとDBアクセスについて よく分かるかと思います。 http://www.atmarkit.co.jp/fjava/rensai/jdbc02/jdbc02.html | ||||||||
|
投稿日時: 2006-06-03 00:39
↓が参考になると思います。 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=9022&forum=12&6 ただ、この方法にしたからといってさしたる性能向上は期待できないと思います。 対象が1万件になるSQLを見直した方が良いと思います。 | ||||||||
|
投稿日時: 2006-06-03 01:13
こういったSQLならばINで解決できますよ。
INのカッコ内は取得したいレコード分をプログラムで組み立てます。 同時に取得したいレコード数が多すぎる場合は、パフォーマンス的なメリットが 小さくなることと、ワーキングセットが肥大化するのでよろしくありません。 適当な件数(数10件程度)ずつ取得できるようにすればよいでしょう。 実装的にはListやQueueにキーを貯めて、一定数貯まる毎に取りに行く感じです。 |