- PR -

セレクト文の最適化について

投稿者投稿内容
まな
常連さん
会議室デビュー日: 2005/10/26
投稿数: 45
投稿日時: 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/01/06
投稿数: 41
お住まい・勤務地: おおさか
投稿日時: 2006-06-02 18:59
SQLを一回発行して
取得できた1レコードを変数に格納していく。
とっても最小構成だと思うのですが、それで遅いと感じるような
速度なのでしょうか?

ここでは書いていないだけで、
何度もこのSQLを発行して、他のレコードの値も取得している。。。?
まな
常連さん
会議室デビュー日: 2005/10/26
投稿数: 45
投稿日時: 2006-06-02 19:06
データが1万件とかになると、1万回セレクトするので、
かなり時間がかかります。
他のレコードの値は取得していません
いーた
大ベテラン
会議室デビュー日: 2004/07/12
投稿数: 154
お住まい・勤務地: 東京
投稿日時: 2006-06-02 19:28
引用:

データが1万件とかになると、1万回セレクトするので、
かなり時間がかかります。


かなりというのはどれ位でしょうか?
また、要求される処理時間は決まっていますか?

目標としている基準があれば提示したほうが良いと思います。
後は環境もですね。少なくともDBMSとそのバージョンはあったほうがベターでしょう。
まな
常連さん
会議室デビュー日: 2005/10/26
投稿数: 45
投稿日時: 2006-06-02 20:27
すみません。勘違いしてました。
SQL文の最適化じゃなくて、
このSELECT文は、一回実行すれば複数行とってこれるから、
それを配列に格納してDBアクセスを一回にしてほしいってこ
とです。
なせ
常連さん
会議室デビュー日: 2006/01/06
投稿数: 41
お住まい・勤務地: おおさか
投稿日時: 2006-06-02 21:09
発行しているSELECT文で複数行のレコードが取得できているなら
rs.next()でどんどん次の行にアクセスしていけば良いのでは無いでしょうか?

とりあえず↓を読んでみるとDBアクセスについて
よく分かるかと思います。
http://www.atmarkit.co.jp/fjava/rensai/jdbc02/jdbc02.html

いーた
大ベテラン
会議室デビュー日: 2004/07/12
投稿数: 154
お住まい・勤務地: 東京
投稿日時: 2006-06-03 00:39
引用:

このSELECT文は、一回実行すれば複数行とってこれるから、
それを配列に格納してDBアクセスを一回にしてほしいってこ
とです。


↓が参考になると思います。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=9022&forum=12&6

ただ、この方法にしたからといってさしたる性能向上は期待できないと思います。
対象が1万件になるSQLを見直した方が良いと思います。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2006-06-03 01:13
引用:

まなさんの書き込み (2006-06-02 18:33) より:
String sPrepareSQL = "SELECT aaa, bbb, ccc FROM S002 WHERE ssss = ?";


こういったSQLならばINで解決できますよ。

コード:

SELECT aaa, bbb, ccc FROM S002 WHERE ssss = IN(?, ?, ?)


INのカッコ内は取得したいレコード分をプログラムで組み立てます。

同時に取得したいレコード数が多すぎる場合は、パフォーマンス的なメリットが
小さくなることと、ワーキングセットが肥大化するのでよろしくありません。
適当な件数(数10件程度)ずつ取得できるようにすればよいでしょう。

実装的にはListやQueueにキーを貯めて、一定数貯まる毎に取りに行く感じです。

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