• 締切済み

検索性能を向上させるには

SQL Server 6.5を使っています。 レコードが100万件あるデータベースで varchar(80)の項目を中間一致で検索しているのですが 大抵タイムアウトになってしまいます。 このような場合に検索性能を向上させるにはどうすればいいでしょうか?

  • udoc
  • お礼率50% (2/4)

みんなの回答

  • yuji
  • ベストアンサー率37% (64/169)
回答No.1

検索用のテーブルを別に作るとか? SQL Server は詳しくないですが、 Oracle なら Inter Media が相当します。 キーワードを抽出して、検索用のインデックス,テーブルを作ってしまうわけです。 (元のテーブルを直接参照しないで検索できるようにする。) その分、ディスクは余計に必要になります。 フリーソフトの Namazu もありますが、 同じような考え方のものだと思います。 (使ったことありません。)

関連するQ&A

  • データベースを分割することでパフォーマンスは向上する?

    現在、Windows2003server+Apache2.0.59+PHP5.2.6の環境のサーバとMySQL4.0.26の環境のサーバがあります。 ibdataのファイルサイズが10GBを超えています。使用しているデータベースは1つだけです。 この度、パフォーマンスの向上のためデータベースを分割すればいいのではないかと検証中です。 データベース分割にあたってMySQL4.1.22の環境を用意して、my.iniにinnodb_file_per_tableの記述を追加しました。 そして、データは分類ごとにデータベースを分けてレコードを格納しました。my.iniのパラメタは4.0の時とほぼ同等に設定しました。 この状態で検証をすると、4.0(分割なし)の状態と変わらないか少し遅いぐらいです。 この手法は、パフォーマンス向上を目的とした場合間違っていますか? 間違っている場合は、他にどのような方法がありますか? SQL文でのチューニングは試行錯誤の結果のものを実行しています。

  • レコードを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 このやり方であっているのでしょうか? または他の仕方があるのでしょうか? 教えていただきたいです。 宜しくお願いします。

  • 大量のデータからの検索

    データ量が膨大にある場合。 例:20万件以上のレコード 検索するフィールドにインデックスをきかせても Web側で表示するときに時間がかかりすぎてタイムアウトになってしまいます。。 何かいい方法はありませんか?

  • あいまい検索のパフォーマンス向上について

    あいまい検索(部分一致)検索をする際に、あいまい検索だとインデックスも効かないので、インデックスを張ってパフォーマンス向上という訳にもいかず、パフォーマンスが非常に悪くて困っています。 状況としては、WEBアプリケーションで、検索画面から検索条件を入力し、「Find」ボタンを押下するとJavaでSQLを発行し、Oracleへ接続するという仕組みのシステムです。 下記のようなケースで、後者のSQLに変更するとガツンとパフォーマンスが向上したのですが、偶然でしょうか? 【もともとのSQL】 select name ,age ,sex ,blood_type ,address from TABLE1 where age >= 20 and age < 30 and blood_type = 'A' and name like '%山%' and address like '%中央区%' / 【パフォーマンスが向上したSQL】 select * from (select name ,age ,sex ,blood_type ,address from TABLE1 where age >= 20 and age < 30 and blood_type = 'A' ) where name like '%山%' and address like '%中央区%' / というふうに、あいまい検索部分を別出ししました。 WHERE句の条件をANDでたくさんつなげる際に、2度の問い合わせにはなりますが、一度あいまい検索以外の条件で絞り込んで、それから再度その結果に対してあいまい検索を実施した方が早いのではないかと思ってやったところ実際に早くなったのですが、これは偶然でしょうか? 件数が増えると逆に遅くなるとかだと、逆効果なので、理論的にはどうなのか、ご存知の方がいらっしゃったら教えてください。 また、実際にはテーブルではなく、VIEWに対しての検索で実施しました。 よろしくお願い致します。

  • SQLの型について

    ASP+SQL初心者、hiroと申します。 ASPからデータベースに 1'56.123 のような計測タイムなどを INSERTする場合、データベースの型は何にしたらよろしいのでしょうか? 今の所、varchar型で試しているのですが、「型が一致しません」と なってしまいます。 char型にCONVERTしても、うまくいきませんでした(結果は同じ)。 以前は、分・秒・1/1000 のように3分割してINSERTしていましたが、 できれば、今回は1つでINSERTしたいと思っています。 よろしくお願いします。

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

    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件ですが、日々増加しています。 どうかよろしくご教授ください。

  • SQLでのデータ検索方法

    以下のようにデータが格納されている テーブルAがすでにあります。  id  in_time  out_time  1         11:10  1   10:30  1         10:15  3   09:50  1   09:30  1         09:00  1   08:30  2         08:10  1         07:50  2   07:40  1   07:30 ここでin_timeとout_timeの範囲が指定されたとき 範囲内でidごとにin_timeとout_timeがセットにな っているデータのみ抽出したいのです。 例えば in_time:7:00~10:20 out_time:8:00~11:30 と指定されたとき、検索結果を  id  in_time  out_time  1         10:15  1   09:30  1         09:00  1   08:30  2         08:10  2   07:40 と表示したいのです。 プログラムで1レコードずつ処理するしかない と思っているのですが、SQLで上記のような結果 を取得する方法はあるのでしょうか。 環境は、 RHEL 5 postgesql 8.1.9 です。

  • PHP + MySQL (さくらサーバ)

    お世話になります。さくらサーバでレンタルサーバを借りています。 とあるMySQLに対してPHPでSelectを発行しているのですが、何が原因かわかりませんが、たまに結果が途中のもので返ってきます。 たとえばレコードが1000件あった場合、50件とかしか戻ってこない場合があります。時間を少しおいたら100件、200件と少しずつ検索時の結果件数が増えて最後には1000件出ます。 しかしまた時間がたった後には検索結果が少なくなったりします。 タイムアウトの場合はエラー表示されるかと思うのですが、何か考えられる原因はあるでしょうか?

    • 締切済み
    • PHP
  • 検索するレコードの件数について

    こんにちわ。 ハントと申します。 SQLで検索するレコードの件数について アドバイスを頂きたいのでよろしくお願い致します。 (質問内容) 検索するレコードが100件あるとします。 この内、50件を検索したいのですが、 うまく抽出できるSQLが思い当たりません。 (ROWNUMを使えばよいと思いましたが、ROWNUMが振られるのは ORDER BY の前であるので、  ORDER BYをした後に順番を振りたいのです。) どのようにSQLを組んだら抽出できるのかアドバイスをよろしくお願い致します。

  • SQL文の処理速度向上策について

    はじめまして 当方、初心者で勉強の身です。ご回答頂けたら幸いです。 3つのテーブルから下記条件の項目を取得したのですが どうにも処理速度が遅く困っております。 副問い合わせなどを使い、速度向上を図りたいのですが 良い案はありませんでしょうか。 <テーブル>テーブル名(項目1,項目2・・・) (1)music(項目1~20)総レコード数1万件 (2)data(項目1~12)総レコード数6万件 (3)inside(項目1~18)総レコード数4万件 3テーブルとも3つの同一項目のKeyで構成されています。 <条件> 今日追加された(1)テーブルのレコードの中で(2)、(3)のテーブル両方ともに存在しないレコードを取得すること。(比較項目は3つのKeyのみ) ちなみに現在のSQLは以下の用になっています。 select DISTINCT a.1, a.2, a.3 (3つともKey項目です。) from music a, data b, inside c where a.4 = 20091118 (該当レコードは10件程度です。) and a.1 != b.1 and a.1 != c.1 and a.2 != b.2 and a.2 != c.2 and a.3 != b.3 and a.3 != c.3 結果として出力されるレコードは5件程度です。 以上です。よろしくお願い致します。