● Access2000・mdbの動作速度をネットワーク越し利用でも速くする方法~最重要項目の1つ~:★ ダミーテーブルの連結フォームを非表示で常時開いておく
※2018/10/10 忘れてたことを思い出したので追記
「Access2000・mdbの動作速度をネットワーク越し利用でも速くする」といっても、mdb本来の速さに戻るだけで、それ以上に速くなるわけではありません。とはいうものの、Jetエンジンは、ローカルPC内や同フロアの小さなLAN内なら「ちゃんと作れば」、SQLServer2000などよりも速いことも少なくないと思います。
といいますか、SQLServer2000自体、意外と速くないです。ストアドプロシージャ使っても、小さなLAN内ならmdbのJETエンジンのほうが速かったりします。
SQLServer2000(あるいはストアドプロシージャ)を使って速くなるのは、VPNなどを使って、離れた拠点(町とか国とか)のmdbを見に行くときなどかもしれません。
Web上や市販書籍には「SQLServer使うと速い!ストアドプロシージャ使うと速い!」という情報が多いので、メッチャ速いのかと勘違いされるかもしれませんが、実際にご自分でも動かしてみればお分かりになると思いますが、「mdbのローカルPC使用」の速さよりも速くないです。
「ネットワーク利用時の、しかも、”mdbの速度低下を招く使い方しかしてない場合(本記事のような対策をしてない場合”、よりは速い」というだけです。後方一致や部分一致ではたしか普通に遅くなったかと思いますし。
あと、リンクテーブルの速さを「(見かけ上)劇速にする=mdbの本来の速さに戻す」には、本記事のこと以外にも次のような方法があるようです。
(01)巻末にも書きましたが、AutoExecマクロで「プロシージャの実行」を使うなどして、DAO(OpenDatabase)などを使ってサーバ側のmdbを常時開いておく。閉じるときに一応Nothingする。
(02)本記事の方法を使わない場合、SQLの中で「IN ('\\ファイルサーバ名\共有フォルダ名\mdbファイル名')」という形で、UNCパスでその都度、ファイルサーバを指定する。
(01)はやったことありませんが、「JET データベースエンジン プログラマーズガイド」のP468・469にも書いてある方法です。巻末にも少し書きましたのでご参考にしてください。(ダメだったらごめんなさい。)
(02)は確か、少しやったことがあるのですが(うろ覚えですみません)・・・、
SELECT 列名 FROM テーブル名 INNER JOIN 結合フィールド名 IN ('\\ファイルサーバ名\共有フォルダ名\mdbファイル名')
・・・みたいな感じで書きます。
IN句でカッコと「'」(シングルクォーテーション)を使ってLAN上のmdbを指定します。
そうすると、本記事の「ダミーフォームの非表示」をさせなくても、結構速かったような気がします。
これはあらかじめ、そのテーブルのリンクテーブルを作る必要は無かったかと思います。(必要があったらごめんなさい!!)
ただ、これも、僕の勘違いで、(速度的に)もしダメだったらごめんなさい。
なお、本記事の方法、DAOを使う方法、では、以下のことを守らないと結局遅いままなので、以下のことも必ずチェックしてください。
・同一リンクテーブルへのUNCパスの統一(UNCパスを使っている場合のみ)
上記の(02)でも、(02)の方法とは関係のない場面で使うリンクテーブルを作ってあると、もしかしたらそうかもしれません。ご自分でもチェックしてみてください。
なんせ、全部うろ覚えのことを思い出しただけなので・・・。
=========
以下、本文です。
ファイルサーバに置いたmdbファイルのテーブルを、複数のクライアントパソコンで共有する場合のお話です。(LAN越しにmdbファイルを共有する場合です。)
ここでのお話は、次のような状況であることが前提です。
(01)Accessのmdbファイルを「データ専用」と「プログラム専用」に分けている。
(02)「プログラム専用」のmdbから、「データ専用」のmdbのテーブルを「リンクテーブル」として覗きに行っている。
(03)「データ専用」のmdbはファイルサーバに格納。
(04)「プログラム専用」のmdbは複数台のクライアントパソコンに格納。
(05)ファイルサーバの「データ専用」のmdbへは複数のクライアントが同時アクセスする
(06)リンクテーブルのパスに「UNCパス」を使っている。統一されていて正常な本来の速度が出る。
このようなときに、ファイルサーバのmdbにアクセスした際、同時接続しているクライアントが1台だけだと速度の低下が起こらないのですが、2台以上になると速度の低下が起こります。
これはOSがWindows2000以降で起こります。(うろ覚えですみませんが、Win98では起こらなかったような・・・。)
なので、それを回避するために、ファイルサーバのmdbに「ダミーテーブルをつくり、その連結フォームを、クライアントのmdb側で、"非表示で"常時開いておく」ということをします。
(この処置をすると、クライアント側のmdbを閉じる速度が少し遅くなりますが、テーブルやクエリが遅くなること・イライラに比べたら全く苦になりません。)
これは、ファイルサーバ側のmdbの数だけやります。
クライアント側の「プログラム専用」のmdbが1つであっても、その1つのmdbから、サーバ上の複数のmdbを、リンクテーブルとして覗きに行っている場合、その数だけやります。
もう少し具体的に言うと、
たとえば、 サーバ上には、「data01.mdb」と「data02.mdb」と「data03.mdb」の3つがあり、
クライアントには、「prg01.mdb」1つだけ、があったとします。
そして、クライアントの「prg01.mdb」からは、その「data01.mdb」~「data03.mdb」の、3つ全部のmdbのテーブルを、リンクテーブルとして見に行っていたとします。
その場合、クライアントの「prg01.mdb」の中には、「data01.mdb」~「data03.mdb」の、全てのmdbのダミーテーブルをソースにした「 ”非表示” の連結フォーム」を作成する、ということが必要になります。
「data01.mdb」~「data03.mdb」全部なので、3つ分必要、ということになります。
(リンクテーブル自体の数は全部で10個以上あるかもしれませんけど、それらのリンク先のmdbの数のぶん、やる、必要、ということです。)
もしこれが、クライアントの「prg01.mdb」から、「data01.mdb」と「data03.mdb」のテーブルだけを見に行っていて、「data02.mdb」のリンクテーブルが一つもない、という場合は、「data01.mdb」と「data03.mdb」のダミーテーブルだけをフォームのソースに使います。
つまり、2個作ればいい、ということになります。
では、作業の流れをご説明します。
ダミーテーブルが一つの時の作業の流れは以下の(01)~(04)のとおりです。
(01)サーバ側の「テーブル専用」のmdbに、「データが空のダミーテーブル」を作成します。
このとき、たとえば「data01.mdb」というmdbファイルにダミーテーブルを作るとするなら、その名前は、「t_data01_dummy」といった感じで付けます。
つまり、どのmdbファイルのダミーテーブルかがすぐに分かるようにします。
これは、複数のダミーテーブルがある場合に区別しやすくするためです。
現在は複数でなくても、近い将来複数に増えることもありますので…。
フィールドのデザインはなんでもいいです。2列くらい作っておけばOKです。
ただ、無用なトライブルを避けるため、一応念のために、主キーは作っておきます。
レコード自体は1つもなくてもかまいませんし、1つくらいあっても、どちらでもいいです。
(02)そしてそのダミーテーブルのリンクテーブルを「プログラム専用」のmdb、例えば「prg01.mdb」の中に作成します。
LAN越しになるので、リンクテーブルのパスにおいて、「UNCパスの統一ミスだけはしないように」ご注意ください。詳しくは以下のページもご参考にしてください。
・同一リンクテーブルへのUNCパスの統一(UNCパスを使っている場合のみ)
これはかなり重要です。
なぜなら、上記のリンクの対策をちゃんとやってないと、本記事のように「ダミーテーブルの非表示フォームを作っても」リンクテーブルの速度は速くならないからです。
(03)「prg01.mdb」の中に、更に、そのリンクテーブルをソースとした連結フォームを作成します。
これも名前がわかりやすいように、「f_t_data01_dummy」といった感じで名前を付けます。
(オートフォーム作成でOKです)
(04)「マクロ」の「autoexec」にて、前項で作成したダミーフォームを自動非表示常時オープン設定にします。
例えば、「f_t_data01_dummy」というダミーフォームを使う場合は以下のようにします。
(a)「マクロ」に「autoexec」という名前のマクロを新規作成します。
autoexecマクロは、Excelのauto_openプロシージャと同じで、ファイルが開いたと同時に自動実行する処理を設定するものです。ファイルオープンやプロシージャの呼び出し実行ができます。
(b)「autoexec」マクロをデザインモードで開き、以下のようにします。
画面上部の「アクション」にて:「フォームを開く」を選びます。
画面下部にて以下の設定にします。(設定値はすべて、ドロップダウンリストから選べます。)
フォーム名:「f_t_data01_dummy」
ビュー:「フォーム ビュー」
フィルタ名:設定なし
Where 条件式:設定なし
データモード:設定なし
ウィンドウモード:「非表示」
(c)「autoexec」マクロを上書き保存します。
以上です。
これをダミーフォーム(つまりはダミーテーブル)の数だけ、やります。
もしダミーフォームが複数ある場合は・・・、例えばダミーフォームが3つある場合なら、「autoexec」マクロの中で、3つ分を3行にわたって、設定します。
「autoexec」マクロは一つしか作成できませんので。
ひとまず、以上です。
============
上記の(01)から(04)を、クライアント側 mdbから覗きに行っているmdbファイルの数だけ、施します。
例えば「data01.mdb」と「data02.mdb」と「data03.mdb」の3つ全部のリンクテーブルがある場合は、そのすべてにダミーテーブルを1つずつ作り、それに伴ってクライアント側に3つのダミーフォームも作ります。
「data01.mdb」と「data03.mdb」のリンクテーブルだけで、「data02.mdb」のリンクテーブルは一つも無いなら、ダミーテーブルは「data01.mdb」と「data03.mdb」だけに1つずつ作り、それに伴ってクライアント側に2つのダミーフォームも作ります。
もちろん、将来的に、「data02.mdb」、あるいは、「data04.mdb」、「data05.mdb」のリンクテーブルが増えてしまったら、それら全部のダミーテーブルも作り、ダミーフォームも作ります。
繰り返しになりますが、この処置をすると、クライアント側のmdbを閉じる速度が少し遅くなります。
ダミーテーブルの数が増えれば増えるほどちょっとずつ遅くなります。
が、テーブルやクエリが遅くなること・イライラに比べたら全く苦になりません。
また、5つか7つくらいまでなら十分我慢できます、というか慣れてしまえば全く苦になりません。
是非、設定して、本来のmdbの速度を出してください。
*****************
※ 参考
ダミーフォームを作る代わりに、DAOなどでmdbを開いておいてもいいようです。
mdbを開くときや閉じるときに以下の手順でコードを実行します。
1.プログラム専用のmdbを開きます。
2.[データベース] ウィンドウの [モジュール] をクリックし、[新規作成] をクリックします。
もしくは既存のモジュールを開きます。
3.[ツール] メニューの [参照設定] をクリックします。[Microsoft DAO 3.6 Object Library] チェック ボックスがオンになっていることを確認し、[OK] をクリックします。
4.新しいモジュールか既存のモジュールに以降のコードを「Public」の行から全部コピぺ
5.mdbを開くときは、Autoexecマクロでtest0001()を実行
6.閉じるときはメインメニューか隠しフォームの閉じるときイベントでtest0002()を実行
この例では、プログラム専用のmdbから5つのmdbを覗きに行った例です。
(例えば 2つなら、全部2つ分でOKです)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Public db01 As DAO.database Public db02 As DAO.database Public db03 As DAO.database Public db04 As DAO.database Public db05 As DAO.database ’プログラム専用mdbを開くときに実行するプロシージャ(Autoexecマクロなどに書きます) Sub test0001() Set db01 = OpenDatabase("UNCパス\×××01.mdb") Set db02 = OpenDatabase("UNCパス\×××02.mdb") Set db03 = OpenDatabase("UNCパス\×××03.mdb") Set db04 = OpenDatabase("UNCパス\×××04.mdb") Set db05 = OpenDatabase("UNCパス\×××05.mdb") End Sub ’プログラム専用mdbを閉じるときに実行するプロシージャ '(メインメニューか隠しフォームの「閉じるときイベント」などに書きます) Sub test0002() Set db01 = Nothing Set db02 = Nothing Set db03 = Nothing Set db04 = Nothing Set db05 = Nothing End Sub |
ただ、これは僕もテストしてないので自己責任でお試しください。
もしかして、ダミーテーブルやダミーフォーム作るよりも速くなるといいなあ・・・
このサンプルでは5つのmdbに対して処理していますが、2つだけだったら2行分書くだけにします。
もしこれがうまくいくなら、ダミーテーブルやダミーフォームを作らなくてすむので、ラクチンにはなりますね。
でもほんとう、自己責任でお願いいたします。
※重要・関連記事
『 Access2000・100MbpsLAN Pentium3 の「ネットワーク越しのリンクテーブル」の開く速度が遅いときの対処法(Access2000のときからあった既知の問題) 』
『 Access2000・mdbの動作速度をネットワーク越し利用でも速くする方法~結構重要~:★ ダミーテーブルの連結フォームを非表示で常時開いておく 』
『 100MbpsLAN Pentium3 でクエリが遅い場合の対処方法(データベース自体が遅い場合にもチェックしてみます。) 』
『 Access2000・mdbファイルが壊れる場面と回避方法・解決方法 』
『 Excelが遅くなる場合の対処法~Accessや他のソフトからデータを貼付けした時 』
Access2000VBA・Excel2000VBA独学~VBAプログラミングとはどんなプログラミング方式なのか?(簡易版)
=====================
Access2000・mdbファイルが壊れる場面と回避方法・解決方法
Access2000・mdbの動作速度をネットワーク越し利用でも速くする方法~結構重要~:★ ダミーテーブルの連結フォームを非表示で常時開いておく
Access2000 100MbpsLAN Pentium3 の「ネットワーク越しのリンクテーブル」の開く速度が遅いときの対処法(Access2000のときからあった既知の問題)
>Access2000・100MbpsLAN Pentium3 でクエリが遅い場合の対処方法(データベース自体が遅い場合にもチェックしてみます。)
Excelが遅くなる場合の対処法~Accessや他のソフトからデータを貼付けした時
Access2000VBA・Excel2000VBA独学~VBAプログラミングとはどんなプログラミング方式なのか?(簡易版)
Access2000VBA・Excel2000VBA独学~用語:VBAプログラミングでの「オブジェクト」 について
ExcelでもAccessでも、顧客台帳(顧客マスタ)を作るときのヒント(できるだけ細かくしてしまう)
- 投稿タグ
- LAN越しmdbの速度アップ