● Access2000・100MbpsLAN Pentium3の Access2000 ネットワーク越しのリンクテーブルの開く速度が遅いときの対処法(Access2000のときからあった既知の問題)
※ 速くなるわけではなく、mdb本来の動作速度(SQL Serverと比べても意外と速い)に戻るだけです。
※まだ書きかけです。すみません。
また、本記事は、Accessの入ったPCのOSが「Windows2000以降」で、かつ、「2人目以降」の共有者が発生した場合(2接続以降・2接続以上での共有となった時点)でのお話です。
もともとWindows98では簡易クラインとサーバもどきでも 2人以上が同時アクセスしても遅くなりませんし、「Windows2000以降」でも、「1接続だけ」なら遅くはなりません。
「Accessは5人以上が同時アクセスすると極端に遅くなる」というような内容のWeb記事やQ&Aサイトを見かけますが、まったくのデタラメですので信用しないようにしてください。10接続でも20接続でも(よっぽど変な大量自動更新のかけまくりなどをしていない限りは)簡易クラインとサーバもどきの状況であっても、100MbpsLANでも、CPUがPen3であっても、基本的にはmdbの速度は落ちません。
特にダミーテーブルのお話は、Accessを使う私たちド素人でも、1999年ごろから誰もが知っていることですので、デマには惑わされないようにご注意ください。
※2018/10/10 忘れてたことを思い出したので追記
「Access2000・mdbの動作速度をネットワーク越し利用でも速くする」といっても、mdb本来の速さに戻るだけで、それ以上に速くなるわけではありません。とはいうものの、Jetエンジンは、ローカルPC内や同フロアの小さなLAN内なら「ちゃんと作れば」、SQLServer2000などよりも速いことも少なくないと思います。
といいますか、SQLServer2000自体、意外と速くないです。ストアドプロシージャ使っても、小さなLAN内なら(本記事のようなバージョン2000からのセオリーを処置しておけば)、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)の方法とは関係のない場面で使うリンクテーブルを作ってあると、もしかしたらそうかもしれません。ご自分でもチェックしてみてください。
なんせ、全部うろ覚えのことを思い出しただけなので・・・。
=========
目次
・ 名前の自動修正のOFF
・ダミーテーブルの連結フォームを非表示で常時開いておく
・同一リンクテーブルへのUNCパスの統一(UNCパスを使っている場合のみ)
・実テーブルとリンクテーブルのサブデータシートのOFF(VBA)
・実テーブルとリンクテーブルの並べ替え実行プロパティ(OrderByOnプロパティ)のOFF(VBAと手動)
・適度なデータベースの最適化
・テーブルデザインで「空文字の許可」をしない
・LANの速度をGIGABIT(1000Base-T)にする
※Shift+TABキー、もしくは、Homeキーを押すと、目次付近に戻れます。
ここでのことは、システム全体のことです。また、mdbファイルの場合だけです。
以上の項目は、基本的にはやっておかないと、Access2000では、クエリのチューニング(ってほどでもないですね。ただの見直しです。)をしても速度が上がらないことが多いので、必ずチェックしておきます。(2002、2003もかも)
(設定するかしないかは自由ですが、最低限、チェックだけはしておきます。)
以降は、クエリの見直しに関することですが、速くなるかならないかはその時その時の状況にもよります。(あと、2007でmdbファイルを動かすときの参考にはなるかもしれません。)
=========
Accessは、「テーブル」よりも「クエリ」をソースにして、フォームやレポートを作ることが多いソフトです。
ですので、クエリの動作が遅いと、そのクエリをソースにしたフォームもレポートも動作が遅くなってしまいます。ひいてはデータベースシステム全体の動作も遅くなってしまいます。
ですので、クエリの動作を低下させない、ということは、データベースシステム全体の動きも低下しない、ということにむすびつきますので、是非、ご自身でも色々と研究してください。
ここでは、そのクエリのもととなる「テーブル」・・・、特に、ネットワーク越しのパソコンに配置されたmdbへの「リンクテーブル」の動きが遅くならないようにする方法をご紹介します。
「リンクテーブル」の速度が遅いままだと、それがそのまま、クエリも道連れに遅くなってしまうからです。
なお、この処理を実行するのは、mdbを極度に速くするわけではなく、mdb本来の動作速度(SQL Serverと比べても意外と速い)に戻るだけです。
「Accessは、ネットワーク越しだとSQL Server2000と比べて極端にクエリや全体の動きが遅くなる」と言われたりもするのですけど、このTipsを実施すると、クエリも SQL Server 2000 に勝るとも劣らない速度になります。
といいますか、それほど複雑じゃない条件のクエリでは・・・、
「むしろmdbのほうが速くない?」
「え?SQL Server2000ってデフォはこんなに遅いの?もっと速いかと思ってた。」
「別にウチは大規模でもないし、VPNも使わないし、こんな程度の差しかないなら、ストアドプロシージャもいらないね。」
と思えるくらい、mdbの速度が出ます。
というか、それが本来のmdbの速さです。
このTipsはその速さに戻るだけ・・・。です。
100MbpsLAN Pentium3 でも全く問題なく速いので、今のマシンならクエリはもう少し速くなる気がします。数十万件のテーブルを複数同時に扱っても完全一致や前方一致にするとかSQL文内のテキストボックスの直接参照を減らしてリテラル値を使うことを増やすとか基本を守れば、別に1~2秒前後で表示されるクエリのほうが多いです。長くても15秒以内とかのほうが多い気がします。何でもかんでも部分一致にしたら、多分SQL Server でも思ったより遅いと思います。
ついでに、ファイルサーバにmdbを置いて20台以上のクライアントで同時アクセスしてもmdbが壊れないサーバ側のレジストリ設定もご紹介しておきます。
以下です。
・Access2000 ファイルサーバに配置したmdbファイルへの同時アクセスにおいて、mdbファイル破損を激減させるサーバ側のレジストリ設定(Access2000昔からの既知の問題の解決)
https://euc-access-excel-db.com/tips/ct07_se/ct071701_mini_system_make/access2000-mdb-crush-avoid
これをやっておかないと、かなりの頻度で、「同時アクセスでmdbが壊れる」ケースが出てきます。
これもAccess2000の時代からの既知の問題です。
逆に、Accessのことをよく知らない方は、これをしないので、よく「Accessちゃちなおもちゃ。すぐ壊れる。」とおっしゃっている方も多いです。
残念ながらプロ・技術者の中にも少なからずそういう方がいらっしゃいます。
確かに、本格的なRDBSMと比べればそうだと思いますので長々とは反論はしませんけれど、それを信じてしまって零細様や個人事業様が「時間コスト・金額コストを含めて考えたデータ管理効率」を上げられないケースが出てしまうのがもったいないと思いますので(それはそれで害悪のひとつだと思いますので)、ここではmdbが壊れないようにするサーバ側のレジストリ設定についても書かせていただきます。
私たちのような素人目線から見ると・・・、
「技術者なのに、私たち素人でも知っているmdb破損の回避方法を調べもしないなんていかがなものかしら?」
「技術者のくせに、動かぬなら、動かせてみようホトトギスという気概はないのかしら?」
「自分は高度なRDBMSが扱えるから偉いとマウンティングでもしたいのかしら?素人相手に・・・」
「はいはい。よかったですね。あなたは高度なRDBMSが扱えて。私は素人だから別に 壊れないAccessのmdbで十分です。」
とは思いますね。
Access2000のときからずーっと思っていました。
自分自身、SQL Server2000が難しくて扱えない(というか学習時間とコストが折り合わなくてあきらめた)ことからの単なるヒガミ根性・愚痴でしかありませんので大変レベルが低くてすみませんが、もちろん SQL Server 2000 のことを悪くは言うつもりは全くありません。
ソフトはただそこにあるだけなので、それを使う人間が自分の品格を考えないといけないなーと自分自身思います。
零細様や個人事業主様、学生様、中高生様、お子様、独立したいかた、におかれましては、変な情報に惑わされずに、また、僕のように愚かな人間にはどうか、ならないように、そして、ご自分で好きなほうのソフトを自由に、楽しく、便利に、お使いください。
なお、以上は、2000でのTipsなので、2003までならあてはまることもそこそこあると思います。2007でもmdb形式のファイルを扱うなら当てはまるかもしれません。(検証してませんので各自バックアップを取られて、自己責任でご検証くださいませ。)
2007以降で、ACCDBという拡張子だと当てはまらないかもしれませんが、Access2000ではこういうことでリンクテーブルが遅くなるのか、とわかれば、何らかのヒントになるかもしれません。
では以降、どうぞ、ご覧ください。
・ 名前の自動修正のOFF
これはリンクテーブルというより、クエリの速度低下を防ぐTipsかもしれません。
名前の自動修正は便利と言えば便利なのかもしれませんが、Access2000では諸悪の根源でエラーが多発したり、いろんなところの動作が遅くなる原因になります。
運が悪いとこれのせいでmdbファイルが壊れることもあります。
また、「テーブルやフォームの名前は、できるだけ変更しないでも済むように最初からそれを見越して名付けをする」ということをある程度守れば、それほど名前の変更やそれに伴うクエリのSQL内容やVBAコードの修正なども発生しないので(発生したとしても検索や置換での修正で別に困らないので)、これと言ってメリットもありません。
(逆に、VBAプログラムに書いたテーブルやクエリの名前まで自動修正してくれるわけではないので結局不便なままなのです。なので、一度付けた名前は絶対に変えない、と、あらかじめ慎重に考えて名づけしたほうがのちのちメンテの面でも10倍は効率的です。)
ですので、この機能は切っておきます。
これはクエリだけでなくフォームやレポート、データベース全体に影響しますのでAccess2000~2003では特に理由がない限りは必ずOFFにしておきます。
ツール→オプション→全般タブ、にて下図部分の3つのチェックを全部はずして「適用」か「OK」します。
これも最重要事項のひとつです。詳しくは以下のページをご参照ください。
OSがWindows2000以降で、かつ、2接続目以上の同時接続が発生するときに必要です。
(Win98の2接続以上の場合や、Win2000以降でも常時1接続だけの場合は必要ありません。)
● mdbの動作速度をネットワーク越し利用でも速くする方法~結構重要~:★ ダミーテーブルの連結フォームを非表示で常時開いておく
・同一リンクテーブルへのUNCパスの統一(UNCパスを使っている場合のみ)
「同一リンクテーブルへのUNCパスの統一」とは、まず、次のような状況であることが前提です。
(01)Accessのmdbファイルを「データ専用」と「プログラム専用」に分けている。
(02)「プログラム専用」のmdbから、「データ専用」のmdbのテーブルを「リンクテーブル」として覗きに行っている。
(03)「データ専用」のmdb(バックエンド)はファイルサーバに格納。
(04)「プログラム専用」のmdb(フロントエンド)は複数台のクライアントパソコンに格納。
(05)ファイルサーバの「データ専用」のmdbへは複数のクライアントが同時アクセスする
(06)リンクテーブルのパスに「UNCパス」を使っている。
※UNCパス→「¥¥パソコン名かIPアドレス¥共有フォルダ名¥サブフォルダ名・・・¥ファイル名」という形でのパスのことです。
このようなときに、「リンクテーブルのUNCパスの指定」にミスがあると、プログラム側の動作速度(テーブルを見に行くときの速度)が極端に遅くなります。これはLANの回線の太さとは無関係です。
では「リンクテーブルのUNCパスの設定ミス」についてお話します。
大した話じゃないのですが、でも これをミスるとすごく遅くなってしまいます。
例えば、簡易LAN・・・つまりワークグループでのLANを組んだ際、「データ専用」のmdbのテーブルが、まず、次の場所に格納されていたとします。
server01という名前のファイルサーバーの、
「D」ドライブの中の
「mdb」フォルダの中の
「data01」フォルダの中。
そしてmdbファイルの名前が「data000001.mdb」だったとします。
で、このとき、「data01」フォルダに共有設定がなされていたとします。
するとこの場合の「data000001.mdb」のリンクテーブルのUNCパスは、
\\server01\data01\data000001.mdb
となります。
でも、設定ミスか何らかの都合で、「data01」フォルダの1つ上の階層の「mdb」フォルダにも、共有フォルダの設定がなされてしまっていたとします。
このような場合、「data000001.mdb」の中のテーブルのリンクテーブルを「複数」作成するときに、本来なら、その複数のリンクテーブルのすべてのパスが、
\\server01\data01\data000001.mdb
に統一されるはずが、「どうせ同じmdbを見に行くんだから、多少UNCパスが変わってもいいだろう・・・」という誤判断(面倒くさがり)から、一部のリンクテーブルだけ、
\\server01\mdb\data01\data000001.mdb
という風に、異なったリンクテーブルのパスの設定をしてしまうことがあります。
このようなことをすると、Access2000では、なぜか、「すべての」リンクテーブルの開く速度が、「突然」、極端に、恐ろしいほど「劇遅」になってしまいます。
「突然」「全部」のテーブルが遅くなっちゃうのでちょっとビビります。
これを解決するには、リンクテーブルのUNCパスの設定を、
\\server01\data01\data000001.mdb か、
\\server01\mdb\data01\data000001.mdb の
いずれかに統一しなければ解決できません。
(どちらかに統一してあれば大丈夫です)
リンクテーブルのUNCパスを統一すると、メッチャ速くなります。
といいますか、本来のテーブルの動作速度に戻ります。
ファイルサーバのmdbを多くのクライアントで共有している場合、また、そのmdbが複数あるような場合は、UNCパスを統一ミスしてしまいやすいので注意が必要です。
統一されているかのチェックを簡単にするには、オプション設定で隠しオブジェクトを見えるように設定して、そのうちの、「MSysObjects」テーブルの「Database」列を見ます。ここにリンクテーブルのパスが格納されています。
この「MSysObjects」テーブルをCtrl+Aして、Excelに貼り付け、「Database」列で降順に並べ替えて、同じmdbに対して複数のUNCパスが存在したら、どれかに統一します。
(ツール→データベースユーティリティ→リンクテーブルマネージャなどで。VBAで一括書きかえすることも可能ですが、特別な理由がない限りは、リンクテーブルマネージャでやるほうが早いです。)
なお、これはUNCパスの場合だけで、プログラム専用のmdbもテーブル専用のmdbも、両方とも1台の同じパソコンの中にあるときは、パスがバラバラになりようがないので大丈夫です。
・実テーブルとリンクテーブルのサブデータシートのOFF(VBA)
サブデータシート機能がONのままだと、クエリその他の動きが遅くなることがあります。
ですので、例えば以下の VBAプログラムを実行して、すべてのテーブルのサブデータシート機能をOFFにします。(リンクテーブルの場合はリンク先=バックエンド=データ専用のmdbのほうでやります。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
'######################################################## ' 'すべてのテーブルのサブデータシート機能をOFFにする ' '######################################################## Sub TurnOffSubDataSheets() Dim MyDB As DAO.Database Dim MyProperty As DAO.Property Dim propname As String Dim propType As Integer Dim propVal As String Dim strS As String Set MyDB = CurrentDb propname = "SubDataSheetName" propType = 10 propVal = "[NONE]" On Error Resume Next For i = 0 To MyDB.TableDefs.Count - 1 If (MyDB.TableDefs(i).Attributes And dbSystemObject) = 0 Then If MyDB.TableDefs(i).Properties(propname).Value <> propVal Then MyDB.TableDefs(i).Properties(propname).Value = propVal intChangedTables = intChangedTables + 1 End If If Err.Number = 3270 Then Set MyProperty = MyDB.TableDefs(i).CreateProperty(propname) MyProperty.Type = propType MyProperty.Value = propVal MyDB.TableDefs(i).Properties.Append MyProperty Else If Err.Number <> 0 Then MsgBox "Error: " & Err.Number & " on Table " _ & MyDB.TableDefs(i).Name & "." MyDB.Close Exit Sub End If End If End If Next i MsgBox "The " & propname & _ " value for all non-system tables has been updated to " & propVal & "." MyDB.Close End Sub |
よく覚えてないのですみませんが、超昔に、Access2000の、以下のようなKBを見てそのままパクったか、少し変えて作ったんだと思います。変更箇所?は汚いダメコードですみませんが、一応、使えると思います。2007で使えるかはわかりません。すみません。試すならmdbのバックアップとか作って自己責任でお願いいたします。
動かし方もこのWebページから引用します。
1.バックエンド データベース(mdb)を開きます。
2.[データベース] ウィンドウの [モジュール] をクリックし、[新規作成] をクリックします。
もしくは既存のモジュールを開きます。
3.[ツール] メニューの [参照設定] をクリックします。[Microsoft DAO 3.6 Object Library] チェック ボックスがオンになっていることを確認し、[OK] をクリックします。
4.新しいモジュールに上記のコードをコピペして実行します。
なお、全部、「自動」に戻すには、「propVal = "[NONE]"」の行の「NONE」を「auto」に書き換えて実行するだけです。
リンクテーブルの場合は、プログラム側のほうでは全部リンクテーブルなら実施する必要は無かったと思います。でもチェックしてみて もし違ってたら、プログラムのmdb側のほうでも同じことをします。
また、プログラム側のほうに、一時テーブルなどでリンクテーブルじゃないローカルのテーブルがあるなら、その場合も、一応、やっておきます。
設定が完了したかどうかは、以下の方法でできます。
・リンクテーブルかバックエンドのテーブルをデザインモードで開きます。
・「フィールド名」「データ型」などの上で右クリックして「プロパティ」
・サブデータシート名のところが「NONE」になっていればOKです。
元に戻したときは「自動」になります。
・実テーブルとリンクテーブルの並べ替え実行プロパティ(OrderByOnプロパティ)のOFF(VBAと手動)
※これもAccess2000の例です。2002、2003でもできるかもしれません。
※2007ならmdbを使っているときはあてはまるかもしれません。
前項の「実テーブルとリンクテーブルのサブデータシートのOFF」とセットでやっておきます。
ここではすべてのテーブルの「並べ替え実行プロパティ(OrderByOnプロパティ)」をOFFにします。
ONのままだとテーブルを開くのに時間がかかることがあるからです。
これは定期的にチェックしたほうがいいと思います。
もしくは、「あれ?なんかmdb全体の動作が遅い・・・」という時にも見直します。
後述のプログラムで、すべてのテーブルの「並べ替え実行プロパティ(OrderByOnプロパティ)」を自動チェックした際に、もしそれがONになっているテーブルが出てきたら、そのテーブルに対して、次の処理をします。
(a)テーブルを開いて、どこでもいいので右クリックします。
(b)「フィルタ/並べ替えの解除」を押して、テーブルを閉じ、保存を求められたら「はい」でテーブルを閉じます。
これで並べ替え実行が手動でOFFにできました。
(c)そのテーブルをデザインモードで開きます。
フィールドの設定内容のどこか適当な位置で右クリックしてプロパティします。ダイアログがでます。
(d)「並べ替え」の欄に何か設定文字列があったら消します。空白にします。
空白にできたら「×」でダイアログを閉じます。
(e)テーブルデザインの画面を上書き保存で閉じます。
(f)処理できたら、再度、プログラムを実行して、テーブル名が一つも出なくなったら完了です。
もし、OFFにしたはずなのに、OFFになっていないテーブルがあったら、いったん並べ替えを実行して上書き保存し、その後、再度解除して上書き保存してみます。
なお、「並べ替えプロパティ(OrderByプロパティ)」と「並べ替え実行プロパティ(OrderByOnプロパティ)」は異なります。
「並べ替えプロパティ(OrderByプロパティ)」は並べ替えの設定文字列のことで、
「並べ替え実行プロパティ(OrderByOnプロパティ)」は、その文字列通りに並べ替えを実行しちゃうよ!というプロパティです。
なので、「並べ替えプロパティ(OrderByプロパティ)」に並べ替えの設定文字列が入力されていても、並べ替え実行は、OFF設定になっていれば実行されません。
ただ、「並べ替え」の欄に降順設定の文字列(DESC)が入っていると、テーブルを開く際に何かの入力を求められて面倒くさいので、並べ替え実行プロパティをOFFにするときに、一緒に、テーブルのデザイン画面の設定で空白にしてしまいます。
以上は、念のためにリンクテーブルの実テーブルのほうでも、リンクテーブルから開いた時も、両方共でやっておきます。
つまり、テーブル専用のmdbの実テーブルと、プログラム専用のmdbのリンクテーブルと、両方でやります。並べ替えの解除設定と並べ替え設定文字列の消去とをです。
並べ替え設定文字列の消去のほうは、リンクテーブルの場合は、デザインモードにするときに「一部のプロパティは変更できません」というメッセージが出ますが、構わず、設定をします。
「並べ替えプロパティ(OrderByプロパティ)」はリンクテーブルもテーブルも別々に変更できますので。
「並べ替え実行プロパティ(OrderByOnプロパティ)」も同様に別々に設定されています。
なので、両方とも、(a)~(f)の処置をしておきます。
「並べ替え実行プロパティ(OrderByOnプロパティ)」がONになっているか、OFFになっているかは、後述のチェックプログラムを以下の手順で実行します。
1.バックエンド データベース(mdb)を開きます。
2.[データベース] ウィンドウの [モジュール] をクリックし、[新規作成] をクリックします。
もしくは既存のモジュールを開きます。VBEditorの画面が出ます。
3.[ツール] メニューの [参照設定] をクリックします。[Microsoft DAO 3.6 Object Library] チェック ボックスがオンになっていることを確認し、[OK] をクリックします。
4.表示→イミディエイトウィンドウ で、イミディエイトウィンドウを表示します。
ここに、チェックにヒットしたテーブル名が表示されます。
5.新しいモジュールか既存のモジュールに下記のチェックプログラムのコードをコピペして実行します。
6.イミディエイトウィンドウをチェックします。
ここに 「テーブル名---True」と表示されたテーブルは、
「並べ替え実行プロパティ(OrderByOnプロパティ)」がONになっていますので、
開いて「フィルタ/並べ替えの解除」をOFFにして保存します。
以下、チェックプログラムです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
'######################################################## 'テーブルの「並べ替え実行プロパティ(OrderByOnプロパティ)」 'がONかOFFかを調べるコード '' '######################################################## Sub tbl_orderby_chk() Dim dbs As DAO.Database Dim tdf As TableDef On Error GoTo error1 Set dbs = CurrentDb For Each tdf In dbs.TableDefs '貼り付けエラーのテーブルで「プロパティが見つかりません」エラーになるのを回避 If tdf.Name = "貼り付けエラー" Then Else 'システムテーブルで「プロパティが見つかりません」エラーになるのを回避 If (tdf.Attributes And dbSystemObject) = 0 Then If tdf.Properties("OrderByOn") = True Then _ Debug.Print tdf.Name & "---" & tdf.Properties("OrderByOn") End If End If Next tdf error1: ' Debug.Print tdf.Name & "---" & Err.Description dbs.Close MsgBox "終了しました。" End Sub |
上記のプログラムを改変して、直接、「並べ替え実行プロパティ(OrderByOnプロパティ)」をOFFにしてしまってもいいと思います。
・適度なデータベースの最適化
・テーブルデザインで「空文字の許可」をしない
・LANの速度をGIGABIT(1000Base-T)にする
僕の使用している環境では、100MbpsのLANで、数十万件のテーブルをもつ複数のmdbを同時に扱い、また、25台くらいのクライアントパソコンからmdb共有していても、十分な速度が出ているので特にGIGABITにする必要はないのですが、ここでのTipsを試しても速度が出ないのでしたら、試す価値があると思います。
以下のQ&Aサイトの「sttkhr123さん」のご回答によると、体感速度が2倍くらいにはなるそうです。
「・Accessでの抽出が遅いので早くする方法はないでしょうか?」
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1032948365
ちょっと前まではGIGABIT LANのHUBは値段が高かったのでなんとも微妙でしたが、最近少し安くなったのでクライアントPCの台数が少ない場合は、検討しても良いかもしれません。
なお、LANが速いとAccesssも速くなる理由は、恐らくですが、「Accessは1レコードを読み込むのでも、先に、テーブルのすべてのデータをメモリに読み込む仕様」だそうだからだと思います。
でも実際の挙動はそこまで・・・遅くない気がするんですが・・・。
何故かというと、例えばファイルサーバ上の200MB以上あるmdbファイルを覗きに行くリンクテーブルでも、そこからクエリにて「数十万件以上あるうちの数十件」を読み込むのでも、100MbpsのLANでも1秒くらいだし、メモリの増加量も1000mB以上になるのかなと思いきや、実際にはそうはなっていないので・・・。
Access2000での実態ですけど、このへんはよくわかりません。
Access97のときの挙動はわかりませんが、Access2000では、Web上でよく言われる「遅い、遅い、メモリ食う」という状況には・・・確かにメモリは食うことは食いますが、ぎゃあぎゃあ言われるほど思ったより多く食ってないし、また、遅くもなりません。
「みなさん本当にAccessの基本をちゃんとおさえてる?」とどうしても思ってしまうのですが・・・。
なので、よくわかりません。
※関連記事
『 Access2000・100MbpsLAN Pentium3 の「ネットワーク越しのリンクテーブル」の開く速度が遅いときの対処法(Access2000のときからあった既知の問題) 』
『 Access2000・mdbの動作速度をネットワーク越し利用でも速くする方法~結構重要~:★ ダミーテーブルの連結フォームを非表示で常時開いておく 』
『 100MbpsLAN Pentium3 でクエリが遅い場合の対処方法(データベース自体が遅い場合にもチェックしてみます。) 』
『 Access2000・mdbファイルが壊れる場面と回避方法・解決方法 』
『 Excelが遅くなる場合の対処法~Accessや他のソフトからデータを貼付けした時 』
Access2000VBA・Excel2000VBA独学~VBAプログラミングとはどんなプログラミング方式なのか?(簡易版)
Access2000VBA・Excel2000VBA独学~用語:VBAプログラミングでの「オブジェクト」 について
ExcelでもAccessでも、顧客台帳(顧客マスタ)を作るときのヒント(できるだけ細かくしてしまう)
- 投稿タグ
- LAN越しmdbの速度アップ, クエリ, パソコンでの自動化, ビジネスパソコンの基礎