検索スピードの速い方法を教えてください

このQ&Aのポイント
  • PostgreSQLを使ったJavaシステムで、検索スピードが最も速い方法を教えていただきたいと思います。
  • 現在考えているのが、tblSのデータをArrayListに読込み、ArrayListの検索を行う方法です。
  • 現在、tblSの件数は1500件ですが、日々増加しています。
回答を見る
  • ベストアンサー

検索スピードの速い方法を教えてください

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の問題のような。

Horirin39
質問者

お礼

ご回答ありがとうございました。 たいへん参考になりました。 snameにインデックスをつけることも含めて対応してみようと思います。

その他の回答 (4)

  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答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件目とかあり得るということです。

Horirin39
質問者

お礼

ご回答ありがとうございます。 たいへん参考になりました。

回答No.3

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

Horirin39
質問者

補足

ご回答ありがとうございます。 ArrayListの検索にはSQLを発行しません。 forループで上から順に一致・不一致を調べるロジックです。 よろしくお願いします。

回答No.2

snameにインデックスを張る。 プリペアドステートメントを利用する。 name値が入力されるならば、それって一度に1500件もあるんですかね??

Horirin39
質問者

補足

ご回答ありがとうございます。 私の説明文が判りにくくて申し訳ありません。 nameの入力が5件あるので、5回同じような検索をする、ということです。

  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.1

こんにちは。 変更が無い何度も読まれるデータはキャッシュとしてメモリ上に展開しておく手法も使いますが、リアルタイムなデータが必要であれば都度SQLを発行したほうが効率がいいんじゃないでしょうか。 (私が作るならArrayListではなくMapに持ちます) 実際に処理時間を測ってみるのも手です。 >これを連続して5回(nameが5件ある)行う。 普通にorを使うとかinを使うじゃダメなんですか? クエリの発行付近の処理、一番コストがかかると思いますが。 5回SQLを発行する理由をお教えください。

Horirin39
質問者

補足

ご回答ありがとうございます。 5回SQLを発行するのではなく、ArrayListを5回検索するのです。

関連するQ&A

  • countのスピード

    DBはMySQL/PostgreSQLがメインで、はじめてOracleを触っています。 現在、70万件のデータのあるテーブルを select count(*) from テーブル名 と SQL*Plusで実行してみたところ、結果がかえってくるまで 7秒近くかかってしまいました。 (*)が悪いのかな、と思って count(hoge) にしてみましたが、 大差がありません。。。。 テーブルは、number型の項目が10個、varchar型の項目が2個と それほど大きくはなく、そのうち5つのnumber型の項目に インデックスが貼られています。 count(hoge)で、hogeにインデックスの貼られている項目、貼られていない項目をそれぞれ試してみましたが、これも大差のない時間がかかっていました。このDBはもちろん、オラクルに接続しているのは私1人のみ、という状況です。 70万件というデータ数は決して多い数字ではないと思うのですけれど、オラクルだとこんなものなのでしょうか?オラクルは始めてで、びくびく触っていることもあって、何から手を付けていいのかもさっぱりです。どんな点を見直せばいいのか、教えてください(_ _)

  • 検索エンジンからの検索方法を教えて下さい

    検索エンジンで検索してますが、検索結果を全部見る方法があれば教えて下さい。 言葉をを入力して検索してますが…例えばその結果が500件検索されたとします。その中に自分の探したいHPがあるかリストから探すのに‘次の50件’と次々にリストのページをすすんでいったら、最終的には280件目くらいが最後になりました。気がつけば、検索して最初の画面では、検索件数が500あったのに ページをすすむにつれて、その件数が280件に減ってる…。。。。検索された件数が数十件とか少ない件数でしたら全部でるんですが、何百件となると今まで何度やってみても、最初に表示される検索件数を全部見ることができませんでした。 たしかに中には検索件数だけで、数千数万となることがありますので、それを全部見るのは大変ですから…そういう時には全部出きらないのも分かるんですが。それが数百件の場合でも、やはり最初に検索された件数を全部見ることはできないんでしょうか? 1ページの表示を100件でしても、30件でしてもダメでした。 よい方法、何かやり方がありましたら、どうぞ教えて下さいませm(_ _)m よろしくお願いいたします☆

  • Oracleでの検索方法

    現在、Oracle8.1.7で開発しています。 以下のようなことがやりたいのですが、 よい方法が思いつきません。 あるデータをキーにして、テーブルの中にワイルドカードを 含んだデータを検索したいのです。 ※ワイルドカードを逆引きするようなイメージです。 例)  データが『ABC12345』の場合には、Noが『3』のデータを検索したいのです。    テーブルA  NO NAME   1  AA-1   2  AB_1234_  ←このデータを検索したい。   3  BCEDFG 説明が不十分だと思いますが、 どなかたわかる方がいらっしゃったら教えて下さいm(_ _)m

  • ACCESSで他テーブルから複数の値を検索したい

    WINDOWS XP MSACCESS2003です。 以下、DDDテーブルの中からAAAテーブルのIDOと一致するものを DDDテーブルの項目種類と同様に全件抽出したいのですが、 どのようにすれば宜しいでしょうか?ご教示願います。 いろいろ検索したのですが、うまくいかなくて困っています。 (1)テーブル名:DDD 項目:SOFU_COD、IDO、TEL レコード件数18万件 (2)テーブル名:AAA 項目:IDO レコード件数47件

  • access2000で検索、結果の表示件数制限

    access2000で受注管理をおこなっております。 フォームから条件を指定し,クエリでテーブルを検索し結果を表示している のですが、データが多すぎて困っています。 そこでフォーム上から検索前に表示させる件数を指定する機能をつけたいと 考えています。 100件と指定したとすると、まず100件表示して次の100件を表示する、などの操作が できればいいのですがやり方がわかりません。 せめて、表示件数に達すればあとの検索はしないといった表示件数を制限する 方法だけでも教えてください。よろしくお願いします。

  • レコードを1件のみ取得した後、検索をやめる方法はあるのでしょうか?

    PostgreSQLのデータベースでテーブルから、 "1件のレコードが見つかった時点で、他のレコードを検索するのをやめる" という事はSQLでできるのでしょうか? 【テーブル名 Fruit 】 | id | option | name |  1    2     りんご  2    1     みかん  3    1     メロン  4    1     バナナ  5    4     いちご 上記のようなテーブルから、optionが1のレコードを検索する時、 どのレコードでもいいので、1件見つけた時点で他にも該当のレコードがあるかという検索の処理をしない。 という事はできるのでしょうか? 出来るのであれば、膨大な数のレコードがある場合、検索の時間が減るのでは無いかと思ったのですが・・・ 現在は下記のSQLのように、OFFSETとLIMITを使用して1件のレコードを取得しています。 SELECT      * FROM      Fruit WHERE      option=1 OFFSET 0 LIMIT 1 このやり方であっているのでしょうか? または他の仕方があるのでしょうか? 教えていただきたいです。 宜しくお願いします。

  • 複数フィールドの検索

    MySQL5.0+PHP4.4で検索システムを作ろうとしています。 例えばフィールドが ID,TEXT1,TEXT2,TEXT3,・・・・・・TEXT20 とある場合で、 検索文字(KEYWORD)をTEXT10・・・TEXT20に対してかけたい場合どのような方法があるでしょうか? データ件数は1万件から2万件を想定しています。 テーブルの構造を変えるというものも含めアドバイス頂きたいです。

    • ベストアンサー
    • MySQL
  • googleの検索オプションで検索件数が10件に固定されているが、10

    googleの検索オプションで検索件数が10件に固定されているが、100件で固定する保存項目がなくなっている。そのつど100に変えるのが面倒。何か方法は?

  • 2万件のデータを最も高速に検索する方法

    知恵をお貸し下さい。 2万件ほどの飲食店のデータを 店名や、住所などの条件で検索した結果を表示するような Webサイトの構築を考えているのですが、 このような検索をする際に最も高速に検索できる方法は どんな方法なのでしょうか? 私が考えられる方法としては、 1、データをテキストファイルにしてPHPを記述して検索する。 2、データをテキストファイルにしてPerlのCGIから検索する。 3、データベース(PostgreSQL)からPHPを記述して検索する。 4、データベース(PostgreSQL)からPerlのCGIから検索する。 と、これぐらいしか思い浮かばないです。 WEBサーバーの環境としては、 LINUX、Apache Perl使用可 PHP使用可 PostgreSQL使用可 理由も添えて教えて頂けるとうれしいです。 以上、よろしくお願いします。

    • ベストアンサー
    • CGI
  • SQLを使ったデータの作成

    コマンドプロントを使用し、SQLでデータベースを作成しています。 大きなテーブルを複数作り、複数のデータの作成をしています。 1.テーブルの方の定義を行い、キー項目を決める。 2.データは、一つ一つの項目ごとに、データの型やサイズを決める。 3.いくつか検索をした際に、ちゃんと結果の違いが確認できるように、100レコード程度のデータを作成する。 の制約で制作しています。 SQLに触って、まだあまり経っていないためどうプログラムを組めばいいのか分かりません。    テーブルの意味などや、キー項目、などの言葉の意味もあまり理解出来てません。 例えば データベース:ONLAINGAME テーブル1:MEMBER テーブル2:WEAPON を制作し、MENBERの中に50件、WEAPONの中に50件データを作ればいいのでしょうか。 データの作り方も少し心配です。 create table MENBERl(age int, name varchar(20) , primary key (aa); 上記の文を打ち、insert into MENBER ( age, name) values(20, 'takasi'); と書けば、制約通りデータが格納できるのでしょうか? 分かりずらいとは思いますが、詳しいお答えお願いいたします。