MS Access

Accessであらかじめリンクテーブルを開いておくと劇的に高速化

投稿日:2014年12月11日 更新日:

リンクテーブルに対して「Dlookupで値を探して見つかったらCurrentDb.Execute UPDATE~ で値を更新」という処理をループで回している。

この処理、一旦始めると、終えるのに30分以上かかることがある(件数は100件未満なのに)。
使っている人に、何とかして欲しい・・・と言われた。

調べてみると、コード中で単純なDlookupをしている1行だけでも、3秒ほど結果が出るのを待たされていることに気がついた。(イミディエイトウィンドウで確認)
数万件のテーブルとはいえ、参照しているだけなのにこんな時間がかかるはずがない。変だ。
で、試しにこのDlookupで参照しているテーブルをあらかじめ開いておいて、もう一度同じ処理を回してみた。

すると、100倍くらい速くなった! 数秒で終わる。

テーブルそのものでなく、そのテーブルを使っているフォームをhiddenで開いておいて、(閉じないで)そのあと見えなくしたものでも同じくらいに速くなった。

DoCmd.OpenForm “master”, , , , , acHidden
Forms!master.Visible = False

テーブルやフォームを開かず、処理の直前でレコードセットを作っても、同じくらいに速くなった(作ったrsは使わない)。

Set DB = CurrentDb
Set rs = DB.OpenRecordset(“master”)

ということは、ひょっとすると、DlookupとCurrentDb.Execute SQL といった関数やSQL文の組み合わせを使わず、rsのレコードセットを使い、素直にFindしたりUpdateするのが良いということかもしれない。(けれどそれだとコード量が増えて、見通しが悪くなるしナァ・・・)

また、Access2013よりも、Access2000と2007の方が、パフォーマンスが劇的に変わった。
こうしておくと、テーブルの内容をメモリに読み込んで処理するのかな?

これは発見!
しかしGoogleで検索しても、同じようなことを書いている人は見つけられなかった。
みんなが知らないことなの?
それとも、自分の環境だけに依存する現象?

よく分からないけど、結果オーライ。

-MS Access

執筆者:

関連記事

no image

Accessでメッセージ内容が無い(のっぺらぼう、OKボタンのみ)エラーメッセージがでる

自分作のモジュールの記述で、以下のように書いている箇所があって、 If rs.EOF = True Then GoTo Err_chkFukuyamaVcr ‘error Else   (中略) また …

no image

Accessのフォームを開く際、acHiddenとVisibleの組み合わせで高速化

Accessのフォームを開く際、acHiddenとVisibleの組み合わせで高速化 Accessのとあるシステムで、 フォームを開いてフィルタをセットして実行してさらに並べ替える・・・という処理をし …

no image

access覚書

複雑な親子フォームを作る際、テーブル設定でインデックスを2つのフィールドとも「はい (重複あり)」にすることで、親のコンボボックスに子が連動するようになった。 Excelでコピーした表データをテーブル …

no image

Accessクエリでのフィールド名は同じので重複できる

Accessではクエリの中で同じフィールド名を使えない! ・・・とずっと思っていた。 なので、テーブルで使っているフィールド名でクエリの結果を出す必要があった際には、クエリを二つ作ってそれぞれ前処理 …

no image

AccessでNot in だと Null が抽出されないのは

以下のページに詳しく。 ACCESS クエリ 条件以外のレコードを抽出するには? – Access(アクセス) 解決済 | 教えて!goo <http://oshiete.goo.n …