#33 | DAOのレジストリチューニング(MaxBufferSize) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Accessでレコードセットを扱うとき、そのパフォーマンスに与える要因には、キーの設定や正規化、フィールド構造、クエリ構造などのデータベース構造や、プログラム上のパラメータ(OpenRecordsetメソッドなど)などがありますが、今回は「Jetデータベースエンジン」そのものの設定を変えることによる影響を調べてみることにします。具体的には、Jetデータベースエンジンに関するレジストリのエントリを操作してみます。 Dim dbs As Database Dim rst As Recordset Dim varDummy As Variant Set dbs = CurrentDb Set rst = dbs.OpenRecordset("顧客マスタ") With rst Do Until .EOF varDummy = !顧客ID varDummy = !会社名 varDummy = !顧客の氏名 varDummy = !顧客のシメイ varDummy = !支社名 varDummy = !請求先住所 varDummy = !市区町村 varDummy = !都道府県 varDummy = !郵便番号 varDummy = !地域 varDummy = !顧客の部署名 varDummy = !電話番号 varDummy = !内線番号 varDummy = !FAX番号 varDummy = !電子メールアドレス varDummy = !備考 .MoveNext Loop .Close End With ここでは、単なるレコード移動だけでなく、すべてのフィールドが走査されるよう、varDummy変数に各フィールド値を代入する処理を交えています(あくまでも念のため)。また、Windows自体のディスクキャッシュなどの影響も考慮し、各テストパターンごとにパソコンを再起動し、その直後にAccessを起動、このプログラムを複数回実行するように留意しました。 テストパターンとしては、MaxBufferSizeの値を次の4つに変化させて、その処理時間を測定・比較します。キャッシュの効果は2回目以降の実行時に表れるはずなので、各条件ごとに5回同じプログラムを実行するものとしました。ちなみに、テストに用いたパソコンの総メモリは512MBです。 テスト結果は次のようになりました。 結果をみてみると、キャッシュサイズを100MBや200MBにしたとき、3回目の実行時に約25秒も処理時間が短縮されており、他に比べて大きな効果が出ていることがわかります。しかしもともとの時間が大きいので、パフォーマンスとしてはけっしてよいとはいえません。2回目以降の相対的な時間の差異ではなく、絶対的な処理時間をみると、明らかにデフォルト設定が優位であることが分かります。このことから、『MaxBufferSizeの設定値によって微妙にパフォーマンスが変わることは確かであるが、大きければ大きいほどよいということはなく、デフォルト値のままが最適のようである』と結論付けてよさそうです。パソコンの総メモリ容量などに応じてこのレジストリ値を変えてパフォーマンスを調整することはできるが、Jetデータベースエンジンが自動的にしてくれる(であろう)設定はかなり最適化されているものであり、わざわざこれを変更するほどのことはないといえるでしょう。 なお、今回のテストで、次のような現象を確認することができました。
これらは、おそらくWindows自体が持つディスクキャッシュなどの影響ではないかと思われます。Jetデータベースエンジンの内部キャッシュもさることながら、パソコンにそれなりのメモリを搭載することによって、あるいは高速なハードディスクを使うことによって、また異なるパフォーマンスが得られそうです。その一方で、総メモリ容量を考慮せず、レジストリのMaxBufferSizeだけをいじることは、やはり危険があるといえるかもしれません。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Copyright © T'sWare All rights reserved |