#15 リンクテーブル経由か外部MDBの直接参照か?

結論
モジュールから外部のMDBファイルのテーブルにアクセスする場合には、リンクテーブルを使うよりもWorkSpaceオブジェクトを使って直接外部MDBファイルを開いた方が速い。

データベースアプリケーションを、テーブルだけで構成されるデータ用のMDBとフォームやレポート・モジュールなどだけで構成されるアプリケーション用のMDBに分割して作成するような場合、そのテーブルをフォーム・レポートのレコードソースとして扱うには外部のMDB上にあるテーブルをリンクして使うしかありません。一方、モジュールからこのテーブルを参照する場合には、リンクテーブルだけでなく、WorkSpaceオブジェクトとそのOpenDatabaseメソッドを使うことによって外部のMDB上のテーブルを直接参照することができます。直接とはいってもJETデータベースエンジンが仲介していることには変わりはありません。そこで、「内部的にはJETデータベースエンジンによるほとんど同じ処理が行われ処理時間に大差はないだろう」と推測しながらも、外部MDBのテーブルに対する2つの参照方法を比較してみたいと思います。

テスト内容としては、外部のMDBファイル上にある同じテーブルに対して、5万件のレコード追加とその全レコードの読み込み、全レコードの更新、さらに全レコードの削除を2つの方法で実行してみます。

コードとしては次のように、データベースを開く部分がCurrentDbかWorkSpaceオブジェクトのOpenDatabaseメソッドかの違いだけです。

  Dim dbs As Database
  Dim rst As Recordset
  Dim ilngLoop As Long
  Dim varTemp As Variant
  Const cRecMax As Long = 50000

  'リンクテーブルに対するテストでは次の行を実行します
  Set dbs = CurrentDb
  '外部のMDBファイルを直接参照するテストでは次の行を実行します
  Set dbs = DBEngine.Workspaces(0).OpenDatabase("TestEx.mdb")
  
  '以下は2つのテスト共通
  Set rst = dbs.OpenRecordset("tblTest")
  ts_Watch "テスト開始", True
  GoSub AddSub        'レコードの追加
  ts_Watch "追加"
  GoSub SelectSub     'レコードの選択
  ts_Watch "選択"
  GoSub EditSub        'レコードの更新
  ts_Watch "更新"
  GoSub DeleteSub     'レコードの削除
  ts_Watch "削除"
  rst.Close: dbs.Close
  
  Exit Sub

AddSub: 'レコードの追加
  With rst
    For ilngLoop = 1 To cRecMax
      .AddNew
        !Data1 = "ABCDE"
        !Data2 = 12345
      .Update
    Next ilngLoop
  End With
  Return

SelectSub: 'レコードの選択
  With rst
    .MoveFirst
    For ilngLoop = 1 To cRecMax
      varTemp = !Data1
      varTemp = !Data2
      .MoveNext
    Next ilngLoop
  End With
  Return

EditSub: 'レコードの更新
  With rst
    .MoveFirst
    For ilngLoop = 1 To cRecMax
      .Edit
        !Data1 = "FGHIJ"
        !Data2 = 98765
      .Update
      .MoveNext
    Next ilngLoop
  End With
Return

DeleteSub: 'レコードの削除
  With rst
    .MoveFirst
    For ilngLoop = 1 To cRecMax
      .Delete
      .MoveNext
    Next ilngLoop
  End With
  Return

テスト結果は次のようになりました。なお時間の単位は"秒"です。
参照方法 追加 選択 更新 削除
リンクテーブル経由 70 7 55 46
WorkSpaceオブジェクト+OpenDatabaseメソッドによる参照 52 5 35 27


予想に反して処理時間に大きさ差が出ました。特に追加・更新・削除での約20秒の差は無視できないような大きな差といえるでしょう。理由としては、リンクテーブルの場合にはテーブル情報やフィールド情報あるいはレコードのポインタの管理など、「リンク」という内部動作のために要される時間が多いのではないかと推測できますが、内部的な問題なので定かではありません。ただ、これだけの差がでると、モジュール上でのリンクテーブルに対する扱いについては今後考え方を変えないといけないようです。

今回はAccessのMDBファイルをリンク元のデータベースとしてテストを行いましたが、リンクテーブルのいいところはMDBファイルだけでなく、ODBCなどを使ってさまざまなデータベース形式のテーブルをローカルテーブルと同じように扱えるところにあります。しかし、リンクした後の扱いは同じと言ってもパフォーマンスの面ではリンク元のデータベース形式によって差があるでしょうし、モジュールから直接参照する場合にも今回のテストで使ったコードとは異なる方法で接続しなければならないでしょう。またネットワークを使っているような場合にはサーバー側とローカル側のやり取りやキャッシュの影響なども大きいと考えられます。したがって、その相手のデータベース形式や環境によって今回のようなテストの実施結果は当然変ってくる可能性がありますので、実際にはそれぞれの環境でテストしてみることが必要だと思います。
| Index | Prev | Next |

 

Copyright © T'sWare All rights reserved