プロが教える店舗&オフィスのセキュリティ対策術

現在、リンクテーブルに対し、以下のクエリを作成しております。

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文はわかりづらいだろうとも考えます。

どちらかを犠牲にするしかないのでしょうか。
もっと良い方法があるのでしょうか。

漠然とした質問で申し訳ありませんが、よろしくお願いします。

A 回答 (2件)

Q、棚卸しの手法。


A、棚卸一時テーブルを一気に作成。

これで、サーバーの関連テーブルとのアクセスは全て終了。
で、関連テーブルは、他のクライアントに開放できます。
で、参照や印刷では棚卸一時テーブルを利用。

Access のリンクテーブルはその都度に全てのデータを取り込んで処理。
そのデータを参照する都度に再び全てのデータを取り込んで処理。
これを二重、三重に仕掛ければ処理が遅くなるのは必定。

最初から3を作成しても1万件でも1、2秒かと思います。
で、表示は時間計測不能かとも・・・。

この回答への補足

回答ありがとうございます。

>Access のリンクテーブルはその都度に全てのデータを取り込んで処理。
>そのデータを参照する都度に再び全てのデータを取り込んで処理。
>これを二重、三重に仕掛ければ処理が遅くなるのは必定。

やはりそうですよね。
他の者に聞いたところ、私よりももっと初心者のため、
後から変更することはないとのことでした。
リンクテーブルをやめ、パススルークエリで一時テーブルに
INSERTする方向でいきたいと思います。

補足日時:2008/06/27 17:17
    • good
    • 0

元のDBシステムが何だか分かりませんが、以下のようにすれば


効率は改善されると思います。
(1)Q_在庫の品番をプライマリキーにする
(2)Q_受注の品番にインデックスを付ける
(3)Q_在庫の品番とQ_受注の品番の間でリレーションシップを設ける
(4)SQL文にDISTINCTを付けない
この他、DBシステムによっては条件式の書き方、大文字小文字の統一
くらいでも処理速度に差が出ることが、しばしばあります。

3.Q_可否のような結果を求めるSQLはさほど複雑とは思えません。
よほど言語体系の異なるSQLでなければ、保守性の心配は少ないと
思います。但し、処理速度の足を引っ張っている原因は色々あるので、
パススルーにして、劇的な改善が得られるかどうかは不明でしょう。

この回答への補足

回答ありがとうございます。

ACCESS2003とSQLSERVER2000を使用しています。

>(4)SQL文にDISTINCTを付けない
について調べ、existに変更しました。
また、パススルークエリに変更したところ、2,3秒になりました。

ありがとうございました。

補足日時:2008/06/27 17:18
    • good
    • 1

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

関連するカテゴリからQ&Aを探す