Accessレポートが重い時はパススルークエリを使うと良い

リンクテーブル使用のAccessレポートが重いという事象が発生しました。

Access + Mysqlの環境で私が作成した在庫管理システムで
お客様からレポートが異常に重いと問い合わせがあり調査した所
予想外に重くなっていて、印刷ボタンを押すと「応答なし」になり
しばらくするとようやく印刷されるという・・・

しかも出庫伝票出すだけなのにどうして?という・・

<原因>
・データ量がかなり増えてきたこと
 →ちなみに ship_unit 51888件ほどでSQLに関数を使用したりしていたのも要因のようです。
・リンクテーブル使用のレポートは重くなる

<回避策>
案1)レポートのソースをリンクテーブルではなく実テーブル(ローカルテーブル)にして
 印刷ボタン押下時に必要なデータだけ抽出し印刷用テーブルにdelete & insertする
 →デメリット accessを複数分散して配布している場合すべてのaccessソースを入れ替えないといけない

案2)レポートに指定しているクエリの使用方法を変更
 通常のクエリを組み合わせたものを指定していたのを
 リンクテーブルを使わないで直接mysqlにアクセスする「パススルークエリー」を使う
 
■使い方
上部メニュー作成→クエリデザイン
SQL→パススルーを選択
20161104_access

パススルーにすると直接mysqlにアクセスしてデータを抽出します。
なのでかなり軽減されます。
構文もmysqlの構文でSQLを書いて保存します。
パススルーで作成したクエリデータとローカルテーブルを組み合わせた
クエリを作成して帳票を出力することで速度アップができました。
パススルークエリに引数も設定できるようですが
今回は、一覧で何件選択されるかわからないデータに対し
選択された件数分、伝票を出したいということだったので
ローカルテーブル=一覧表示にしてチェックされたのはローカルテーブルの
フラグを立てているので、ローカルテーブルとパススルークエリをJOINした
クエリを作成してレポートに紐づけることで、解決しました。

なおしたのは、クエリを修正したのみです。

必要に応じてmysqlのインデックスも貼ったりすれば良いかと思います。
accessの限界か?と思って諦めそうになっていたけれど無事に解決して良かったです。

コメント

タイトルとURLをコピーしました