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

ドメインのDNSの管理会社を移転したら、BASP21でSMTP送信がエラー

CPIも、BASP21も、どちらもマイナー(笑)なので、誰の役にも立たないかもしれないけど、自分の備忘録として、残します。 これまでCPIでWebもメールも動かしていたが、WebのみをShopifyに …

no image

DoCmd.GoToRecordよりもMe.SaveよりもMe.Refresh

Accessで、一旦フォーム上のレコードを保存したいとき、 Me.Save とやってもレコードが保存されない。 そこで、今までは、DoCmd.GoToRecordで無理矢理レコードを移動して保存してい …

no image

Access2007でテキストファイルエクスポートしたら1文字ずれる

Access2007で、指定フィールドからLeft関数で10文字とったクエリを作り、固定長でテキストファイルにエクスポートしたら、5000件のデータのうち3件だけが、文字が末尾に1桁多く入り、後ろがず …

Access「実行時エラー3061 パラメータが少なすぎます。2を指定してください」で意外な決着

クロス集計クエリをVBAで読むときで、かつパラメータクエリを使う場合には、クエリのパラメータパネルで、別途、パラメータを指定しなくてはならない(VBAで使わないなら不要) 本日のトラブルは、その後、W …

no image

AccessでコンボボックスのリストをVBAで行番号で選択する

こんな方法があるのは知らなかった。 メモメモ。 ‘コンボボックスの1行目を選択する ‘Forms!見積請求書F.cbo銀行振込先 = Forms!見積請求書F.cbo銀行振込先.ItemData(0) …