#22 Jetデータベースエンジン3.5と4.0を比較する

結論
単純なテーブルアクセスのテストでは「JETデータベースエンジンは遅くなった」という数値が出たが、結論を出すには早急かもしれない。今後の調査要!。

Access2000のリリースとともに、Accessの基本的なデータベースエンジンである「Jetデータベースエンジン」もバージョン3.5から4.0にバージョンアップされました。それに伴いJetデータベースエンジンへのアクセスをカプセル化したオブジェクト「DAO(Data Access Object)」も3.5から3.6にバージョンアップされました。Access97の「Jet3.5+DAO3.5」という組み合わせに対して、Access2000(.MDBの場合)では「Jet4.0+DAO3.6」という組み合わせでテーブルやクエリーにアクセスします。データアクセスの中心がDAOからADO(Microsoft ActiveX Data Objects)に移行しつつあるという状況と、0.1だけのバージョンアップということもあり、DAOの持つオブジェクト、メソッド、プロパティなどには特に目新しいものはないようです。事実、データベースデザインに関する新機能やWeb対応、SQL Serverなどのフロントエンド開発ツールとしての新機能など、Access2000本体に関してはいろいろ取り沙汰されているものの、最新のDAOに関してはあまり情報を見かけません。一方、Jetデータベースエンジンの方は0.5のバージョンアップで、DAOがあまり外見的に変わっていないことからして刷新的なものはないにしても、多少は内部的な機能向上が図られているのではないかと想像できます。そこで今回は、データアクセスの基本的な操作についてそれらの実行時間の比較を行い、その違いを探ってみることにしました。

今回行うテストは、このAccess Laboですでに何回か使っているコードを利用して、テーブルへのレコード追加・読み込み・更新・削除を行うものです。総レコード数は1万件で、空のテーブルに1万レコードをループで追加、その後その全レコードに対して読み込みと更新、削除を行うという手順で2つのケースについてテストを行います。もちろん1つ目のケースは「Access97+Jet3.5+DAO3.5」、2つ目のケースは「Access2000+Jet4.0+DAO3.6」です。

テストコードとしては次のようなものを使います。2つのテストケースについてはオブジェクトライブラリへの参照設定に違いがあるものの、コード自体はまったく同じものを使うことができます。


Dim dbs As Database
Dim rst As DAO.Recordset
Dim ilngLoop As Long
Dim varDummy As Variant
Const clngRecMax As Long = 10000

Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("tblTest")
  
ts_watch "テスト開始", True
'レコードを追加
For ilngLoop = 1 To clngRecMax
  With rst
    .AddNew
      !Data1 = ilngLoop
      !Data2 = ilngLoop * 2
      !Data3 = "ABC"
      !Data4 = "EFG"
    .Update
  End With
Next ilngLoop
ts_watch "レコード追加"
  
'レコード読み込み
rst.MoveFirst
For ilngLoop = 1 To clngRecMax
  With rst
    varDummy = !Data1
    varDummy = !Data2
    varDummy = !Data3
    varDummy = !Data4
    .MoveNext
  End With
Next ilngLoop
ts_watch "レコード読み込み"
  
'レコード更新
rst.MoveFirst
For ilngLoop = 1 To clngRecMax
  With rst
    .Edit
      !Data2 = ilngLoop * 3
      !Data3 = "HIJK"
      !Data4 = "LMN"
    .Update
    .MoveNext
  End With
Next ilngLoop
ts_watch "レコード更新"
  
'レコード削除
rst.MoveFirst
For ilngLoop = 1 To clngRecMax
  With rst
    .Delete
    .MoveNext
  End With
Next ilngLoop
ts_watch "レコード削除"

rst.Close
dbs.Close



そして、テスト結果はつぎのようなものになりました。
Access97+JET3.5 Access2000+JET4.0
追加 2.1 30.1
読み込み 0.6 5.4
更新 1.2 53.3
削除 0.7 68.4
これはあまりにも予期しない結果です。Access2000のテスト結果はAccess97の10倍以上の値になっています。しかし間違いなく結果を逆に書いてしまったわけではありません。これだけ大きな差が出てしまうと、テストのやり方そのものに問題があるのではないか、Access2000でDAOを"普通"に使うための何か大切なスイッチを1つ押し忘れているのではないかといった心配さえ出てきます。今回のテストではまずAccess97のデータベースを作成し、それをAccess2000にコンバートするという順番で行いました。しかし単純にコンバートするだけではいけないのではないかと考え、いくつかの可能性を試してみることにしました。
  1. テーブルそのものをAccess2000上で作り直してみる
  2. モジュールそのものをAccess2000上で作り直してみる
  3. トランザクションのステートメント(BeginTrans〜CommitTrans)を入れてみる
  4. ADOなどの不要な参照設定があったので、それらをすべて外してみる
  5. テーブル内のテキスト型フィールドの「Unicode圧縮」プロパティを"なし"にしてみる
  6. 時間測定に用いたT'sWatcherを使わずに実行してみる
これらの項目はすべて時間を測定してみたわけではありませんが、結局、明らかにAccess97の結果に近づいているとは言えるものはひとつもありませんでした。

今回の結果はあまりにも予想外であったため、この結果だけから「JETデータベースエンジンは遅くなった」という結論を出すには早急かもしれません。Access2000のデータベース構造も含めて、今後いろいろ調査していく必要がありそうです。

なお、上記の表にまとめたテスト結果とは別に、Access2000のテストで気づいたいくつかの特徴的な点があったので、次にまとめておきます。もちろんその要因は分かっていません。ある種のAccess2000データベースの特性的なものかもしれません。
  • Access2000では同じテストを重ねるごとに実行時間が数秒単位で増加していった。Access97ではほとんど変化しない。
  • Access2000ではテストによるファイルサイズの増加が非常に極端であった。Access97ではもともと86KBであったのものがちょうど1MBになったが、Access2000では148KBが実に80MBを越えるまでに増大した。
  • Access2000では、テスト実行後、テーブルのデザインを開くにも時間がかかるようになった
| Index | Prev | Next |

 

Copyright © T'sWare All rights reserved