Accessのリンクテーブルが遅い問題

以前、お客さまの環境で、Accessの動作が極端に遅くなるトラブルが起きました。
その際の対処法をご紹介します。

お客さまの環境

クライアントPC:画面ありのaccdbファイル(画面部分だけ)
ファイルサーバー:画面なしのaccdbファイル(データベース部分だけ)
定番の「画面」と「データベース」を分けた構成です。

トラブル事象:リンクテーブルの読込みが遅い

ある日、データベース部分のAccessファイルを、社内のローカルネットワーク環境から、
社外の共有ファイルサーバーに移したところ、Accessの動作が“極端に”遅くなりました。

原因切り分けのため、データベース部分のAccessファイルの配置場所を色々と変えながら、
時間を計測してみました。

データを表示する時間

・ローカルPCに配置した場合:1秒以内
・ローカルネットワーク上の他のPCに配置した場合:1~2秒
・社外のファイルサーバーに配置した場合:30~40秒

という結果となり、データが表示されるまで30倍も待たされるという異常事態でした。
この結果だけを見ると、ファイルサーバーに何かしら原因があるように思えました。

しかし、不思議なことに、
このAccessを使わなければ、サーバーを使用していて特に不都合は見られないのです。
そのため対処法がすぐ分からずに何度かお客さまを訪問して調査を繰り返しました。

後日、調査して分かった原因が、リンクテーブルとADOの併用でした。

リンクテーブル、ADOとは?

リンクテーブルとは

別のAccessのテーブルへリンクさせてデータを読み書きする機能です。
Accessではお馴染みとも言える機能です。

ADO(エーディーオー、ActiveX Data Objects)とは

Access VBAや、他の言語からも使用できるデータベースアクセス手段の1つで、
Accessの標準機能よりも複雑なデータベース操作を行ったり、より高速なデータ読み書きを行うことができます。

対処法:ADOからリンクテーブルを使わないようにして解決

ADOを使う場合、データベースに接続する方法はいくつかあり、その方法を変えることで、
このお客さまの環境では実行速度が改善されることが分かりました。

1. Accessのカレントデータベースに接続(→速度が“極端に”遅い)

CurrentProject オブジェクトの Connection プロパティを使用してデータベースに接続します。
この方法だと、データベースは常にOPENしているので、最も簡単です。
リンクテーブルも、普通のテーブルと同じ感覚でクエリを使用できます。
今回のAccessは当初この方法を使用していたのですが、リンクテーブルにアクセスすると応答が極端に遅くなることが分かったため、使わないことにしました。

2. ADODB.Connectionオブジェクトを新規作成して接続(→速度は普通)

ConnectionString文字列にAccessファイルのパスを指定することで、別のAccessファイルのデータベースをOPENし、接続します。

今回、1.から2.の方法に変えてみたところ、Accessの速度が通常どおり回復し、トラブルは解決しました。

まとめ:ADOを使う際はリンクテーブルに注意

今回の根本的な原因は、Access内部に何かしら問題があるものと考えます。
その問題を回避する方法を何とか見つけ出すことができ、トラブルが解決したのでホッとしました。

ADOは、Accessデータベースだけでなく、OracleやSqlServerなど他の主要なデータベースにも接続することができる、汎用性の高いデータベース利用手段です。
今回、ADOを使わないように対応する方法も考ましたが、その場合はプログラムがほぼ作り直しとなるため、現実的な方法ではありませんでした。

AccessでADOの使用を検討する際は、

・テーブルリンクと併用していないか?
・本当にADOを使う必要があるか?

という点に特にご注意いただければと思います。

また、必ずしも同じ事象が、同じ方法で解決するとは言えませんし、環境によってはそもそも事象が起こりません。

もし同様のトラブルが起きた時には、ぜひお問合せください。

Access開発サポートがわかる、
3つのコンテンツ