dポイントプレゼントキャンペーン実施中!

access2003で検索フォームを作成しています。

リレーションの結ばれた複数のテーブルを対象に、検索語句による検索をしようとクエリを作っています。

基本となるテーブルには数値(ID)が中心となっており、それらの実際の値をDlookUpで参照して結果を作っています。

この際に、DlookUpで指定した参照元について抽出条件を設定すると異様に時間が掛かり、実用的ではなくなってしまいました。

テーブルの構成上、DlookUpを使わざるを得ないので、その参照元も含めて検索語句で抽出できるようにしたいのですが、
どのようにすればレスポンスの良い検索クエリができますでしょうか。

A 回答 (4件)

ついでに、


http://www.accessclub.jp/ado/refresh.html
http://www.amy.hi-ho.ne.jp/banchan/sw/vba/v1.html

ADOにてSQLとは、こんな感じです。 クエリーが作れれば、それをSQLビューにすると(カッコだらけですが)SQL文を見ることができます。 (コピーしてVBAに貼り付けるだけでよいわけです。)
コネクションを変えるとサーバに直接問い合わせることができます。 (dbによりSQL文が多少異なるものもありますので調整が必要になる場合もあります。)
    • good
    • 0
この回答へのお礼

ご丁寧に有難うございます。

現在、複数のクエリと複数のワークテーブルを組み合わせて、
とりあえず思うような結果が出力できるものを製作中です。

完成したら、ADOでのデータアクセスに挑戦してみます。
どの程度負荷が軽減され、動作が軽快になるのか楽しみもありますね。

リンクはScrapBookに保存しておきます。

改めて、ADOに躓いたら質問させて頂きます。

ご回答頂きました皆様、有難うございました。

お礼日時:2007/08/30 18:24

No2ですが、


リンクテーブルなら、インデックスは設定できません。

MDB内で完結させようとすると、クエリの作成方法に全てがかかってくることになります。
>ワークテーブルを用意し検索の度に削除クエリと追加クエリを実行し最新の状態にし、そのワークテーブルを一つのクエリで抽出するようなイメージのものです。
リンクテーブルであれば、このようなやり方をすることになります。
順番によって速度が変わることがありますのでいろいろやってみるのが良いと思います。

どちらかといえば、ADOでSQLを使う方法をとられたほうが、将来的にデータが増えた際の対応としては楽になると思います。(直にサーバにSQL文で問い合わせをするよう変更するだけですから。)
そんなに難かしいことではありませんので、取り組んでみたらいかがでしょうか?
    • good
    • 0

実際に実験してみないと効果があるかどうかはわかりませんが、


1.インデックスを指定する。 検索されるフィールドにインデックスを振っておくことにより検索が早くなることがあります。
2.パラメータクエリ(選択)を使用した場合とDLookupを使った場合で時間を比べてみる。
>テーブルの構成上、DlookUpを使わざるを得ないので
私は、そんな場合に直面したことはありません。 ほかのやり方が必ずあると思います。
3.ADOのSEEKメソッドを使った際の時間と比べてみる。
4.ADOで直接SQLを使ってレコードセットを作ってみる。

経験上(大したものではありませんが)では結局のところ(2)普通の選択クエリを使うのが一番早いことが多いです。 複数のテーブルがリンクされていて、それぞれに抽出条件がある際は、数が限定されるクエリを先に行い仮テーブルに書き出しておくことにより、レスポンスが良くなることがあります。

データベース構造とは関係ありませんが、Accessをインストールしているドライブと、MDBがおいてあるドライブを物理的に分けると多少早くなるという話があります。(比較したことはありません。)

この回答への補足

ご回答有難うございます。

ADO,SQLのについてまだ理解していないので、1,2項の部分について取組んでみたいと思います。

その場合、、、
1.については、検索対象はLAN内のSQLサーバーのテーブルにリンクさせています。
この場合、現在のmdbのリンクテーブルにインデックスの設定をしても構わないものなのでしょうか?
また、それでインデックスの効果が出るのでしょうか?

2.については、DlookUpを使わないで選択クエリを用いるということは、クエリを階層化するという事でしょうか。
過去に経験があるのは、ワークテーブルを用意し検索の度に削除クエリと追加クエリを実行し最新の状態にし、
そのワークテーブルを一つのクエリで抽出するようなイメージのものです。
この考え方でよいのでしょうか?
フォーム上からの検索契機に対して、2重(3重?)のクエリを実行させる事になりますので、荒業的なのかなとも心配です。

お手数お掛けいたしますが、アドバイス頂けたら幸いです。

3.4についてはスキルアップに伴って検証してみます。

補足日時:2007/08/30 16:04
    • good
    • 0

DlookUpで指定した参照元のデータ件数が異常に多い?そうでもなければ、参照元が複雑なクエリになっているとか。

又は、外部のDBを参照してると遅いですけど、そんなことではないですよね?

情報が少ないので、何が原因かはよく解らないですね。思い当たりそうな物を書いてみました。

この回答への補足

早速のご回答有難うございます。

漠然としていて申し訳ありません。
どの程度まで表現するとうまく伝わるか、考えてはいるのですが、まだまだ未熟もので。

ちなみにテーブルは全てリンクテーブルで、社内のSQLサーバーにリンクしています。
このテーブルから現場に合わせた情報を検索したいと思っています。

また、件数は15,000レコードを越えているところで、今後も5,000件/年程度増えていくと思われます。
この辺がボトルネックだとすると、構成を考え直さなければいけないなと。

なお、DlookUpの指定によっては条件が複雑すぎるというエラーが出ます。

リレーションのつなぎ方などを再考してみます。

補足日時:2007/08/30 15:58
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!