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