
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件ですが、日々増加しています。
どうかよろしくご教授ください。
No.5ベストアンサー
- 回答日時:
> nameの入力が5件あるので、5回同じような検索をする、ということです。
なるほど、意味がわかりました。
それなら5つのnameを一度に検索すれば済みますね。
(発行すべきクエリは#4の回答がそのままその通りでしょう)
そのかわり、ロジックが面倒になると思います。
感覚的に、
1.SQLを発行してResultSetを取得
2.SQLの結果を専用クラスかなんかに突っ込んで、それをHashMapなどsnameをキーにして格納
3.探す時に、2.ので作った変数に対して、HashMap.get(sname)で求める
こんな感じになる気がしますが、どうなんでしょう?
ロジック内で余計なループをする必要が出てくるなら、
検索スピードが速くなっても、レスポンスタイムも速いとは限りませんよね。
クエリを投げるよりロジックで頑張る方が遅いっていうのも往々にありますし。
AppサーバとDBサーバが分かれていて、絶対的な制約として、極力ネットワーク通信をしない、
Appサーバの処理性能に任せるというコンセプトならSQL一発ってのが正解かも
しれませんが。
こんな些細な部分に、それをやるほどの意義があるのかと言うと甚だ疑問です。
仮にその検索がいちいち遅いとすると、そもそもプログラムではなくDBの問題のような。
ご回答ありがとうございました。
たいへん参考になりました。
snameにインデックスをつけることも含めて対応してみようと思います。
No.4
- 回答日時:
こんにちは。
補足ありがとうございました。
>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件目とかあり得るということです。
No.3
- 回答日時:
補足について
> 5回SQLを発行するのではなく、ArrayListを5回検索するのです。
意味不明です。
ArrayListを5回検索=5回SQLを発行する
としか読み取れません。何が違うのでしょう?
この回答への補足
ご回答ありがとうございます。
ArrayListの検索にはSQLを発行しません。
forループで上から順に一致・不一致を調べるロジックです。
よろしくお願いします。
No.1
- 回答日時:
こんにちは。
変更が無い何度も読まれるデータはキャッシュとしてメモリ上に展開しておく手法も使いますが、リアルタイムなデータが必要であれば都度SQLを発行したほうが効率がいいんじゃないでしょうか。
(私が作るならArrayListではなくMapに持ちます)
実際に処理時間を測ってみるのも手です。
>これを連続して5回(nameが5件ある)行う。
普通にorを使うとかinを使うじゃダメなんですか?
クエリの発行付近の処理、一番コストがかかると思いますが。
5回SQLを発行する理由をお教えください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テーブルからのselectにおいて...
-
postgreSQLのint型は桁数指定が...
-
SQL SELECT文 別テーブルのレコ...
-
ビット演算結果の取得
-
データを削除しても表領域の使...
-
ORA-00959: 表領域'****'は...
-
DELETE文でFROM句を省略した場合
-
Data Pump で大量データインポ...
-
SQLでスキーマ名(所有者名)の...
-
Viewにインデックスは張れ...
-
テーブル名を[]でくくらないと...
-
CLOB型へのINSERT
-
ACCESS 複数テーブル・複数フィ...
-
他の処理でselectさせないよう...
-
Access レコードを追加できませ...
-
ActiveX DLLでのオラクルのトラ...
-
同じSELECT文同士でのデ...
-
oracleのimpdpでORA-39166
-
Access2019でフォームから入力...
-
object browser で処理を中断す...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
postgreSQLのint型は桁数指定が...
-
テーブルからのselectにおいて...
-
UNIQUEをつけたときのINDEXテー...
-
PostgressからMySQL(MariaDB)...
-
クエリアナライザのsp_helpコマ...
-
SQL文作成のお願い
-
ベスト3の抽出方法
-
検索スピードの速い方法を教え...
-
postgreSQLのオートナンバーに...
-
SQL SELECT文 別テーブルのレコ...
-
こんばんは。
-
Perl DBI でSELECT ilikeの結果...
-
特定カラムの値を変更したいの...
-
pl/pgsqlで変数の扱い
-
Oracle でのデータベースサイズ...
-
テーブル作成 外部参照 配列
-
チェックボックスから、データ...
-
賢いSQL文がわからない
-
マルチテーブル・インサート
-
データを削除しても表領域の使...
おすすめ情報