#15 | リンクテーブル経由か外部MDBの直接参照か? | ||||||||||||||||
データベースアプリケーションを、テーブルだけで構成されるデータ用のMDBとフォームやレポート・モジュールなどだけで構成されるアプリケーション用のMDBに分割して作成するような場合、そのテーブルをフォーム・レポートのレコードソースとして扱うには外部のMDB上にあるテーブルをリンクして使うしかありません。一方、モジュールからこのテーブルを参照する場合には、リンクテーブルだけでなく、WorkSpaceオブジェクトとそのOpenDatabaseメソッドを使うことによって外部のMDB上のテーブルを直接参照することができます。直接とはいってもJETデータベースエンジンが仲介していることには変わりはありません。そこで、「内部的にはJETデータベースエンジンによるほとんど同じ処理が行われ処理時間に大差はないだろう」と推測しながらも、外部MDBのテーブルに対する2つの参照方法を比較してみたいと思います。 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 テスト結果は次のようになりました。なお時間の単位は"秒"です。 予想に反して処理時間に大きさ差が出ました。特に追加・更新・削除での約20秒の差は無視できないような大きな差といえるでしょう。理由としては、リンクテーブルの場合にはテーブル情報やフィールド情報あるいはレコードのポインタの管理など、「リンク」という内部動作のために要される時間が多いのではないかと推測できますが、内部的な問題なので定かではありません。ただ、これだけの差がでると、モジュール上でのリンクテーブルに対する扱いについては今後考え方を変えないといけないようです。 今回はAccessのMDBファイルをリンク元のデータベースとしてテストを行いましたが、リンクテーブルのいいところはMDBファイルだけでなく、ODBCなどを使ってさまざまなデータベース形式のテーブルをローカルテーブルと同じように扱えるところにあります。しかし、リンクした後の扱いは同じと言ってもパフォーマンスの面ではリンク元のデータベース形式によって差があるでしょうし、モジュールから直接参照する場合にも今回のテストで使ったコードとは異なる方法で接続しなければならないでしょう。またネットワークを使っているような場合にはサーバー側とローカル側のやり取りやキャッシュの影響なども大きいと考えられます。したがって、その相手のデータベース形式や環境によって今回のようなテストの実施結果は当然変ってくる可能性がありますので、実際にはそれぞれの環境でテストしてみることが必要だと思います。 |
|||||||||||||||||
|
Copyright © T'sWare All rights reserved |