みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
Win7 FilemakerPro11利用です。
レコードが30万件ほどあります。
対象レコードの絞り込みでレコードを検索しているのですが、クエリが1分ほどかかります。
あまりにも時間がかかっていて効率が非常に悪いのですが、改善方法はわかりません。
ホストのパソコンのスペックは悪くはないと思います。
なにか改善方法あればご教授お願い致します。
Offline
索引が非保存なのでは?
ホストは、FMPですか、FMSですか。
また、ファイルの構造も重要で、その対象のフィールドは計算フィールドでしょうか。
Offline
ホストはFMSです。
フィールドは全てテキストです。
索引が非保存かどうかは分からないですが、フィールドのオプションを開くと索引設定「最小限」で「必要時に索引を自動設定」となっています。
索引設定とはどのように使うのでしょうか?
Offline
その索引条件は、索引を作成した後、ファイルが閉じられた時に破棄されます。
索引の作成条件を「全て」に変更してみて下さい。この変更は、通常作業として検索するフィールド全てに行われると効果的ですが、ファイルの容量が増加します。
また、リレーションのキーとして参照されるフィールドや、値一覧の対象となるフィールドにも、この設定は必須です。
http://www.filemaker.co.jp/11help/html/ … tml#346316
Offline
検索条件が対象のフィールドを最小限 → 全て に変更しましたが大してクエリ時間が速くなりません。
なにか他に原因があるのでしょうか?
よろしくお願い致します。
Offline
検索条件にワイルドカードを使ってると索引が無効ですが…
あ。
「対象レコードの絞り込みで」がいけないのでは。
検索実行でやってみたら。
具体的に、どのようなデータが入っていて、どのようなキーワードで検索しているのですか。
対象フィールドに長文が入っているのでしたら、どのような方法でも高速に、というのは無理かも。
逆に、フィールドの値との完全一致でしたら、他に対処方法が有ります。
Offline
13項目あって12項目がフィールドの値と完全一致です。
一つだけ テーブル①::フィールドA:[>""] となっております。
長文は一切ありません。
多くても4文字でほぼ2~3文字です。
よろしくお願い致します。
Last edited by Gajiro (2013-10-14 23:55:46)
Offline
検索条件を指定
処理 条件
レコードを対象外に テーブル①::フィールドA:[NG]
レコードを対象外に テーブル②::フィールドA:[拒否]
レコードを対象外に テーブル②::フィールドA:[会社]
レコードを対象外に テーブル②::フィールドA:[アポ禁]
レコードを対象外に テーブル②::フィールドA:[料金]
レコードを対象外に テーブル②::フィールドA:[PC無]
レコードを対象外に テーブル②::フィールドA:[現アナ]
レコードを対象外に テーブル②::フィールドA:[受注]
レコードを対象外に テーブル②::フィールドA:[工事NG]
レコードを対象外に テーブル②::フィールドA:[未接続]
レコードを対象外に テーブル③::フィールドA:[>””]
レコードを対象外に テーブル④::フィールドA:[未提供]
レコードを対象外に テーブル⑤::フィールドA:[-]
このような形で使っております。
よろしくお願い致します。
Last edited by Gajiro (2013-10-15 00:13:05)
Offline
3テーブル以上をまたいでいますね。この検索は、早くしようがありません。
2テーブル以下にまとめられませんか。
Offline
テーブル数を少なくしたら速くなるのですかね。
2テーブルくらいならまとめられそうですが、そのあとどのようにしたらよろしいでしょうか?
Offline
現状で、テーブル1と2だけで検索してみたら。
その検索条件が一定のものなら、
検索した対象レコードにフラグを付けて
以後はそのフラグを検索すれば格段に速くなるでしょう。
新規レコードや、レコード編集のたびにそのフラグを入力し直すことが必要です。
これはスクリプトで自動化できるでしょう。
Offline
対象外抽出は、対象抽出より時間がかかりますので、避けられる限り変更したほうがいいでしょう。
とりあえず、
レコードを対象外に テーブル③::フィールドA:[>””]
を、
レコードを対象に テーブル③::フィールドA:[=]
に変更してみましょう。
それと、
テーブル②::フィールドAの対象外にするデータをフィルターしたフィールド
FilterValue[ テーブル②::フィールドA ;List ( "拒否" ; "会社".... )]
を作り、そのフィールドが空白なものを検索対象にすれば少しは早くなるでしょう。
2テーブルで大量データを抽出するには、例えば、
レコードを対象外に テーブル①::フィールドA:[NG]
レコードを対象外に テーブル②::フィールドA:[拒否]
という条件でしたら、
レイアウトを変更[テーブル1のレイアウト]
レコードを対象外に テーブル①::フィールドA:[NG]
関連レコードへ移動[対象レコードのみを対象、テーブル2のレイアウト]
検索条件で絞り込み[レコードを対象外に テーブル②::フィールドA:[拒否]]
という方法で行うと早くなることもあります。
Last edited by Shin (2013-10-15 10:25:28)
Offline
すいません。
一つだけ計算フィールドがあってそれを削除して検証したら数段に速くなりました。
テーブル①::フィールドA:[NG] のフィールドです。
このフィールドはテーブル①::電話番号フィールドとテーブル④::電話番号フィールドが一致した場合、フィールド①::フィールドAを[NG]とする計算にしております。
これを計算フィールドにせずにする方法なんかはあるのでしょうか?
よろしくお願い致します。
Offline
Shinさま
テーブル②::フィールドAの対象外にするデータをフィルターしたフィールド
FilterValue[ テーブル②::フィールドA ;List ( "拒否" ; "会社".... )]
を作り、そのフィールドが空白なものを検索対象にすれば少しは早くなるでしょう。
とありますが、これは計算フィールドを用いてやる方法ですか?
計算フィールドを用いるとクエリが明らかに遅くなるようですが、計算フィールドを用いて行う方法はございますでしょうか?
よろしくお願い致します。
Offline
計算フィールドを用いるとクエリが明らかに遅くなる
そうではなく、計算式がテーブルをまたがってるから計算結果が非保存(索引がない)なのです。
違うテーブルにあるデータを比較しているので、普通の方法では鈍足になり、どうしようもありません。
上にも書いている方法の応用ですが、
現在のテーブル1とテーブル4のリレーションと別に、電話フィールドを加えた別リレーションを張っておきます。
そのリレーションを使って、テーブル1のレコードを全表示にし、関連レコードへ移動、でテーブル4へ移ります。その対象レコードから、関連レコードへ移動、でテーブル2へ移ります。
一応、これで
レコードを対象に テーブル①::フィールドA:[NG]ではない
の検索が出来ます。
その対象レコードの中で、その他の検索を、対象レコードの絞り込みで行えば良いはずです。(空欄同士や対象レコードの不在で、稀に、結果が異なる事が有ります)
上の検索条件で少々気になっているのですが、全て同じフィールドなのですか。
Last edited by Shin (2013-10-15 16:29:27)
Offline
もともと全てのテーブルは電話番号でリレーションを組んでいるのですが、さらにリレーションを組むのですかね?
処理 条件
レコードを対象外に テーブル①::フィールドA:[NG]
レコードを対象外に テーブル②::フィールドB:[拒否]
レコードを対象外に テーブル②::フィールドB:[会社]
レコードを対象外に テーブル②::フィールドB:[アポ禁]
レコードを対象外に テーブル②::フィールドB:[料金]
レコードを対象外に テーブル②::フィールドB:[PC無]
レコードを対象外に テーブル②::フィールドB:[現アナ]
レコードを対象外に テーブル②::フィールドB:[受注]
レコードを対象外に テーブル②::フィールドB:[工事NG]
レコードを対象外に テーブル②::フィールドB:[未接続]
レコードを対象外に テーブル③::フィールドC:[>””]
レコードを対象外に テーブル④::フィールドD:[未提供]
レコードを対象外に テーブル④::フィールドE:[-]
わかりづらいくてすいません。
テーブル②::フィールドBだけが同じであとはすべて違うフィールドになります。
Offline
全体のリレーション関係についての説明は初めてですよね。
テーブルの構成とリレーション関係を最初に書いて頂かないと、話が進まないのです。
もともと全てのテーブルは電話番号でリレーションを組んでいるのですが
という説明でしたら、
このフィールドはテーブル①::電話番号フィールドとテーブル④::電話番号フィールドが一致した場合、フィールド①::フィールドAを[NG]とする計算にしております。
は不要、というか、話が矛盾しませんか。
テーブル1は、テーブル2を介して、テーブル4とリレーション関係ですよね。電話番号でリレーションしているのでしたら、電話番号は完全一致していないとリレーション関係にならないのですが。
Offline
1から直接2~4にリレーション、では。
Aは「4に関連レコードがあったら[NG]」という意味だと思うけど、そうすると4の検索は不要ということに。
すいません。
途中で分からなくなってしましました。
とりあえず、検索条件が対象のフィールドを最小限 → 全て と除外の反対の検索で少し速くなったそうです。
ありがとうございました。
Offline
Pages: 1
[ Generated in 0.006 seconds, 9 queries executed - Memory usage: 571.33 KiB (Peak: 592.23 KiB) ]