6万件前後のデーターベースからの効率の良い検索


ニック  2003-04-03 06:07:18  No: 106515

6万件ぐらいのデーターベースMDB(アクセス2000)から
レコードセットを検索したいのですが
検索に非常に時間が掛かります2分程度
  開発にはVB6とADOを選びました
検索内容は、複数の条件から探すのでSQL文で読み出しています
  検索を高速化する方法はないでしょうか?

なお参照するデーターベースは使用するPCによって入っている場所が
違うので指定できるように接続の処理は別にしています


Say  2003-04-03 09:41:49  No: 106516

とりあえず、インデックスのはり方を工夫してみては?


Loreley  2003-04-03 13:31:26  No: 106517

参考になるかわかりませんが、
たとえば検索(取得)と表示をいっしょにやってると遅くなります。
例)
While RecSet.EOF <> True
   sGetData=RecSet.Fields(1)
   List1.Additem "Data:" & sGetData
   Label1.Additem cstr(lCount) & "件目"
'こういうコントロールへの貼り付けが繰り返し文といっしょに入っている場合
   lCount=lCount+1
   RecSet.MoveNext
   DoEvents
wend

こういう場合は100件に一回(まとめて)表示するようにしたほうがいいです
DoEventsもAPIを使って、処理しなければいけないメッセージが来ていれば

DoEventsするというふうにすると少し早くできます

SQLの実行自体が遅いのであればこれは意味ないですけど。(^^;
その場合は6万件全部必要なければ(最近のデータだけ必要なら)
TOP句つかうとかぐらいしか思いつきません


K  2003-04-03 17:45:33  No: 106518

まず具体的にどの部分が遅いのでしょうか?
大きく2点に分かれると思うのですが、
  ・SQLの実行
  ・データの表示
のどちらがボトルネックになっているかを調査すべきかと思います。
仮にSQLの実行であれば、インデックスやSQLの書き方等の工夫ができるかと
思います。
また、データの表示であれば、
ループの回し方や、
コントロールによってはRedrawプロパティをFalseにしておく等の
工夫が考えられます。

その辺りの情報をいただけたらと思います。


ニック  2003-04-05 03:29:18  No: 106519

アドバイスありがとうございます
  起動時に選択SQLである程度レコードセットを
絞り込むようにして、その中から(Find)検索するようにしました
  若干改善されて1分程度で検索できるようになりましたが
遅いんです。不満です(ーー;)
  もしかしたら、PC自体パワーが無いのかもしれませんが
アクセス2000の検索でも2分ほどの時間が掛かります
劇的に検索結果を高速化する方法はないのでしょうか?


ニック  2003-04-05 03:35:23  No: 106520

ごめんなさいデーターレコードは60万件です


Loreley  2003-04-05 07:16:57  No: 106521

これ以上は情報が少なすぎてなんとも。

複数の条件というのが複数のテーブルにまたぐのか
ひとつのテーブル内で複数の条件なのかとか。

60万件だとアクセスだとしんどいかもしれませんねぇ。

それと一番気になるのは
Kさんが言われているように
  ・SQLの実行
  ・データの表示
のどちらが問題なのかも重要ですね。


ニック  2003-04-05 08:53:47  No: 106522

すいません(T_T)
  検索するのはデーターベース内のレコード一件
検索コードがIDコードと登録コード1、2、3、4、の5種類
あるので検索対象となるテーブルは5種類です。
  なお、14種類のカテゴリーに分類して処理するので
接続時に選択SQLを実行して検索対象になるカテゴリーだけ
をレコードセットに読み出し(待ち受け)
その中で(FIND)随時検索しています

  検索結果のテキストだけをコントロールに送っているので
表示では負担は掛かっていないと思います。


nanashi  2003-04-07 19:51:38  No: 106523

>接続時に選択SQLを実行して検索対象になるカテゴリーだけ
>をレコードセットに読み出し(待ち受け)
>その中で(FIND)随時検索しています

ここも気になるんですが、データの読み出しに時間が掛かってるんですか?
それともFindメソッドで時間が掛かってるんでしょうか?
てゆーか、たぶんFindじゃなかと思うんですが……。

テーブルがどうなってるのか良く分からないんですが、
対象となる一件のレコードのみを取得できるSQL文を投げてあげればもう少し早くなるんじゃないかと思います。

あとLoreleyさんもおっしゃってますが、Accessで60万件はキツイので、
MSDEにした方が良いと思いますよ。


K  2003-04-08 04:04:42  No: 106524

実際の仕様をことこまかに並べられても見れないのでわかりませんが、
nanashiさんもおっしゃっている通り、
仮にACCESS MDBで1テーブル60万件だとすると、キツそうです。

MDBしかダメだというのであれば、次にやる事は、
「SQLかFind、どちらが時間を食っているか」
だと思います。
5種類のテーブルというのも気になります。
(結合に問題が?!)

あとはもうコードを載せてしまうしかないかも。
(もちろん全部じゃなくて)
それから、一番最初にSayさんがおっしゃった、
「インデックス」はどうなんでしょうか?
検索の条件となる項目にインデックス指定しておくのとおかないのでは、
結構違いますよ。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加