- ベストアンサー
クエリとパススルークエリを作る時の考え方について
現在、リンクテーブルに対し、以下のクエリを作成しております。 1.Q_在庫:在庫を品番で集計する。 [結果] 品番 在庫 A 100 B 20 2.Q_受注:受注データの残数を集計する。 [結果] ID 品番 納期 予定数 合計数 1 A 20080625 10 10 2 A 20080626 50 60 3 A 20080627 100 160 3.Q_可否:Q_在庫とQ_受注を品番でリレーションし、在庫行を付加し、 在庫が合計数を上回っていれば"○"を表示する。 [結果] 可否 ID 品番 納期 予定数 合計数 在庫 ○ 1 A 20080625 10 10 100 ○ 2 A 20080626 50 60 100 × 3 A 20080627 100 160 100 このとき、Q_可否を実行すると、20秒くらいかかってしまい、 パススルークエリのほうがよいのかな?と考えています。 ただ、私以外の人が後から変更などする場合、 長いSQL文はわかりづらいだろうとも考えます。 どちらかを犠牲にするしかないのでしょうか。 もっと良い方法があるのでしょうか。 漠然とした質問で申し訳ありませんが、よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
Q、棚卸しの手法。 A、棚卸一時テーブルを一気に作成。 これで、サーバーの関連テーブルとのアクセスは全て終了。 で、関連テーブルは、他のクライアントに開放できます。 で、参照や印刷では棚卸一時テーブルを利用。 Access のリンクテーブルはその都度に全てのデータを取り込んで処理。 そのデータを参照する都度に再び全てのデータを取り込んで処理。 これを二重、三重に仕掛ければ処理が遅くなるのは必定。 最初から3を作成しても1万件でも1、2秒かと思います。 で、表示は時間計測不能かとも・・・。
その他の回答 (1)
- nda23
- ベストアンサー率54% (777/1415)
元のDBシステムが何だか分かりませんが、以下のようにすれば 効率は改善されると思います。 (1)Q_在庫の品番をプライマリキーにする (2)Q_受注の品番にインデックスを付ける (3)Q_在庫の品番とQ_受注の品番の間でリレーションシップを設ける (4)SQL文にDISTINCTを付けない この他、DBシステムによっては条件式の書き方、大文字小文字の統一 くらいでも処理速度に差が出ることが、しばしばあります。 3.Q_可否のような結果を求めるSQLはさほど複雑とは思えません。 よほど言語体系の異なるSQLでなければ、保守性の心配は少ないと 思います。但し、処理速度の足を引っ張っている原因は色々あるので、 パススルーにして、劇的な改善が得られるかどうかは不明でしょう。
補足
回答ありがとうございます。 ACCESS2003とSQLSERVER2000を使用しています。 >(4)SQL文にDISTINCTを付けない について調べ、existに変更しました。 また、パススルークエリに変更したところ、2,3秒になりました。 ありがとうございました。
補足
回答ありがとうございます。 >Access のリンクテーブルはその都度に全てのデータを取り込んで処理。 >そのデータを参照する都度に再び全てのデータを取り込んで処理。 >これを二重、三重に仕掛ければ処理が遅くなるのは必定。 やはりそうですよね。 他の者に聞いたところ、私よりももっと初心者のため、 後から変更することはないとのことでした。 リンクテーブルをやめ、パススルークエリで一時テーブルに INSERTする方向でいきたいと思います。