6万件ぐらいのデーターベースMDB(アクセス2000)から
レコードセットを検索したいのですが
検索に非常に時間が掛かります2分程度
開発にはVB6とADOを選びました
検索内容は、複数の条件から探すのでSQL文で読み出しています
検索を高速化する方法はないでしょうか?
なお参照するデーターベースは使用するPCによって入っている場所が
違うので指定できるように接続の処理は別にしています
とりあえず、インデックスのはり方を工夫してみては?
参考になるかわかりませんが、
たとえば検索(取得)と表示をいっしょにやってると遅くなります。
例)
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句つかうとかぐらいしか思いつきません
まず具体的にどの部分が遅いのでしょうか?
大きく2点に分かれると思うのですが、
・SQLの実行
・データの表示
のどちらがボトルネックになっているかを調査すべきかと思います。
仮にSQLの実行であれば、インデックスやSQLの書き方等の工夫ができるかと
思います。
また、データの表示であれば、
ループの回し方や、
コントロールによってはRedrawプロパティをFalseにしておく等の
工夫が考えられます。
その辺りの情報をいただけたらと思います。
アドバイスありがとうございます
起動時に選択SQLである程度レコードセットを
絞り込むようにして、その中から(Find)検索するようにしました
若干改善されて1分程度で検索できるようになりましたが
遅いんです。不満です(ーー;)
もしかしたら、PC自体パワーが無いのかもしれませんが
アクセス2000の検索でも2分ほどの時間が掛かります
劇的に検索結果を高速化する方法はないのでしょうか?
ごめんなさいデーターレコードは60万件です
これ以上は情報が少なすぎてなんとも。
複数の条件というのが複数のテーブルにまたぐのか
ひとつのテーブル内で複数の条件なのかとか。
60万件だとアクセスだとしんどいかもしれませんねぇ。
それと一番気になるのは
Kさんが言われているように
・SQLの実行
・データの表示
のどちらが問題なのかも重要ですね。
すいません(T_T)
検索するのはデーターベース内のレコード一件
検索コードがIDコードと登録コード1、2、3、4、の5種類
あるので検索対象となるテーブルは5種類です。
なお、14種類のカテゴリーに分類して処理するので
接続時に選択SQLを実行して検索対象になるカテゴリーだけ
をレコードセットに読み出し(待ち受け)
その中で(FIND)随時検索しています
検索結果のテキストだけをコントロールに送っているので
表示では負担は掛かっていないと思います。
>接続時に選択SQLを実行して検索対象になるカテゴリーだけ
>をレコードセットに読み出し(待ち受け)
>その中で(FIND)随時検索しています
ここも気になるんですが、データの読み出しに時間が掛かってるんですか?
それともFindメソッドで時間が掛かってるんでしょうか?
てゆーか、たぶんFindじゃなかと思うんですが……。
テーブルがどうなってるのか良く分からないんですが、
対象となる一件のレコードのみを取得できるSQL文を投げてあげればもう少し早くなるんじゃないかと思います。
あとLoreleyさんもおっしゃってますが、Accessで60万件はキツイので、
MSDEにした方が良いと思いますよ。
実際の仕様をことこまかに並べられても見れないのでわかりませんが、
nanashiさんもおっしゃっている通り、
仮にACCESS MDBで1テーブル60万件だとすると、キツそうです。
MDBしかダメだというのであれば、次にやる事は、
「SQLかFind、どちらが時間を食っているか」
だと思います。
5種類のテーブルというのも気になります。
(結合に問題が?!)
あとはもうコードを載せてしまうしかないかも。
(もちろん全部じゃなくて)
それから、一番最初にSayさんがおっしゃった、
「インデックス」はどうなんでしょうか?
検索の条件となる項目にインデックス指定しておくのとおかないのでは、
結構違いますよ。
ツイート | ![]() |