重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

PostgreSQLを使ったJavaシステムで、検索スピードが最も速い方法を教えていただきたいと思います。

・検索するテーブル(tblS)
 scode Varchar 6 主キー
 sname Varchar 30
 stni Varchar 2
 skmk Varchar 2
 stnk Int4

・検索する項目
 入力されたnameがテーブルのsnameに存在した場合、他の4項目のデータを読み込む。
 これを連続して5回(nameが5件ある)行う。

現在考えているのが、tblSのデータをArrayListに読込み、ArrayListの検索を行う方法です。

現在、tblSの件数は1500件ですが、日々増加しています。

どうかよろしくご教授ください。

A 回答 (5件)

> nameの入力が5件あるので、5回同じような検索をする、ということです。



なるほど、意味がわかりました。
それなら5つのnameを一度に検索すれば済みますね。
(発行すべきクエリは#4の回答がそのままその通りでしょう)

そのかわり、ロジックが面倒になると思います。
感覚的に、
 1.SQLを発行してResultSetを取得
 2.SQLの結果を専用クラスかなんかに突っ込んで、それをHashMapなどsnameをキーにして格納
 3.探す時に、2.ので作った変数に対して、HashMap.get(sname)で求める

こんな感じになる気がしますが、どうなんでしょう?

ロジック内で余計なループをする必要が出てくるなら、
検索スピードが速くなっても、レスポンスタイムも速いとは限りませんよね。
クエリを投げるよりロジックで頑張る方が遅いっていうのも往々にありますし。

AppサーバとDBサーバが分かれていて、絶対的な制約として、極力ネットワーク通信をしない、
Appサーバの処理性能に任せるというコンセプトならSQL一発ってのが正解かも
しれませんが。


こんな些細な部分に、それをやるほどの意義があるのかと言うと甚だ疑問です。
仮にその検索がいちいち遅いとすると、そもそもプログラムではなくDBの問題のような。
    • good
    • 0
この回答へのお礼

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

たいへん参考になりました。

snameにインデックスをつけることも含めて対応してみようと思います。

お礼日時:2013/07/25 11:38

こんにちは。



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

>5回SQLを発行するのではなく、ArrayListを5回検索するのです。
これだったらDBに直接SQLを投げたほうがいいです。

select * from tblS where sname in ( 'name1', 'name2', 'name3', 'name4', 'name5' );

これ1回投げれば結果が返って来ると思うんですが。

ArrayListなんて使ったら、最大1500回近いループ(増える予定)を5回実行することになりますよ。
先頭の方にあればかなり少ないループ処理になると思いますが。

リストの場合こんな処理になりますよね。

for ( Record record : recordList ) {
if ( record.getSName().equals(name) ) {
// 合致
// break;
}
これを5回分。recordListが1500件あって合致データが1400,1401,1402,1403,1405件目とかあり得るということです。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

たいへん参考になりました。

お礼日時:2013/07/25 11:32

補足について


> 5回SQLを発行するのではなく、ArrayListを5回検索するのです。
意味不明です。
ArrayListを5回検索=5回SQLを発行する
としか読み取れません。何が違うのでしょう?

この回答への補足

ご回答ありがとうございます。

ArrayListの検索にはSQLを発行しません。
forループで上から順に一致・不一致を調べるロジックです。

よろしくお願いします。

補足日時:2013/07/25 10:25
    • good
    • 0

snameにインデックスを張る。


プリペアドステートメントを利用する。

name値が入力されるならば、それって一度に1500件もあるんですかね??

この回答への補足

ご回答ありがとうございます。

私の説明文が判りにくくて申し訳ありません。

nameの入力が5件あるので、5回同じような検索をする、ということです。

補足日時:2013/07/24 16:40
    • good
    • 0

こんにちは。



変更が無い何度も読まれるデータはキャッシュとしてメモリ上に展開しておく手法も使いますが、リアルタイムなデータが必要であれば都度SQLを発行したほうが効率がいいんじゃないでしょうか。
(私が作るならArrayListではなくMapに持ちます)

実際に処理時間を測ってみるのも手です。


>これを連続して5回(nameが5件ある)行う。
普通にorを使うとかinを使うじゃダメなんですか?
クエリの発行付近の処理、一番コストがかかると思いますが。
5回SQLを発行する理由をお教えください。

この回答への補足

ご回答ありがとうございます。

5回SQLを発行するのではなく、ArrayListを5回検索するのです。

補足日時:2013/07/24 16:37
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す