• ベストアンサー

クエリとパススルークエリを作る時の考え方について

現在、リンクテーブルに対し、以下のクエリを作成しております。 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文はわかりづらいだろうとも考えます。 どちらかを犠牲にするしかないのでしょうか。 もっと良い方法があるのでしょうか。 漠然とした質問で申し訳ありませんが、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#140971
noname#140971
回答No.1

Q、棚卸しの手法。 A、棚卸一時テーブルを一気に作成。 これで、サーバーの関連テーブルとのアクセスは全て終了。 で、関連テーブルは、他のクライアントに開放できます。 で、参照や印刷では棚卸一時テーブルを利用。 Access のリンクテーブルはその都度に全てのデータを取り込んで処理。 そのデータを参照する都度に再び全てのデータを取り込んで処理。 これを二重、三重に仕掛ければ処理が遅くなるのは必定。 最初から3を作成しても1万件でも1、2秒かと思います。 で、表示は時間計測不能かとも・・・。

tokonoko
質問者

補足

回答ありがとうございます。 >Access のリンクテーブルはその都度に全てのデータを取り込んで処理。 >そのデータを参照する都度に再び全てのデータを取り込んで処理。 >これを二重、三重に仕掛ければ処理が遅くなるのは必定。 やはりそうですよね。 他の者に聞いたところ、私よりももっと初心者のため、 後から変更することはないとのことでした。 リンクテーブルをやめ、パススルークエリで一時テーブルに INSERTする方向でいきたいと思います。

その他の回答 (1)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

元のDBシステムが何だか分かりませんが、以下のようにすれば 効率は改善されると思います。 (1)Q_在庫の品番をプライマリキーにする (2)Q_受注の品番にインデックスを付ける (3)Q_在庫の品番とQ_受注の品番の間でリレーションシップを設ける (4)SQL文にDISTINCTを付けない この他、DBシステムによっては条件式の書き方、大文字小文字の統一 くらいでも処理速度に差が出ることが、しばしばあります。 3.Q_可否のような結果を求めるSQLはさほど複雑とは思えません。 よほど言語体系の異なるSQLでなければ、保守性の心配は少ないと 思います。但し、処理速度の足を引っ張っている原因は色々あるので、 パススルーにして、劇的な改善が得られるかどうかは不明でしょう。

tokonoko
質問者

補足

回答ありがとうございます。 ACCESS2003とSQLSERVER2000を使用しています。 >(4)SQL文にDISTINCTを付けない について調べ、existに変更しました。 また、パススルークエリに変更したところ、2,3秒になりました。 ありがとうございました。