#02 レコード読み込み時の OpenRecordset メソッドのパラメータを試す

結論
JETデータベースエンジンでは OpenRecordset メソッドのパラメータに dbReadOnly などを使用すると読み込み時間が若干長くなる。

ここではテーブルからの"レコード読み込み"に関連した OpenRecordset メソッドのパラメータについて、いくつかその処理時間を比較してみます。OpenRecordset メソッドのパラメータとして使用可能な定数には ODBCDirect を対象としたものもありますが、ここではJETデータベースエンジンの読み込みに関連した次の3つの定数を取り上げてみます。ご覧のように、他のユーザーとの排他制御のレベルによって分類されているもので、自分が読込んだレコードのロック制御に取られる時間の程度によって定数ごとの処理時間に違いが出てくることが予想されます。  

dbReadOnly 自分や他のユーザーがレコードセットを変更できないようにします。
dbDenyWrite 他のユーザーに対してレコードに対する書き込みを禁止します。他のユーザーは読み込みができますが、レコードを編集したり追加したりすることはできません。
dbDenyRead 他のユーザーに対してテーブル自体へのアクセスを禁止します。これはテーブルタイプのレコードセットのみ使用可能な定数です。

テストの概要としては、すでに10万件のレコードが保存されている、ID(オートナンバー型)、Data1(テキスト型)、Data2(テキスト型)の3つのフィールドから構成されるテーブルから、すべてのレコードを読み込む時間を測定するものです。それぞれの定数についてダイナセット(Dynaset)タイプのレコードセットとテーブル(Table)タイプのレコードセットも比較します。基本的なテストコードは次のようなものです。

  Dim dbs As Database
  Dim rst As Recordset
  Dim dummy

  Set dbs = CurrentDb
  ts_watch "テスト開始", True
  Set rst = dbs.OpenRecordset("TestData", dbOpenDynaset, dbReadOnly)・・・・・・条件を変えてみる部分
     'Set rst = dbs.OpenRecordset("TestData", dbOpenTable, dbDenyWrite)
  With rst
    Do Until .EOF
      dummy = !Data1
      dummy = !Data2
      .MoveNext
    Loop
    .Close
  End With
  ts_watch "テスト完了"  


そして、テスト結果はつぎのようなものになりました。
Recordsetのタイプ パラメータ 実行時間(秒)
Dynaset なし 20.9
dbReadOnly 21.3
dbDenyWrite 21.6
Table なし 15.8
dbReadOnly 15.7
dbDenyWrite 15.9
Table dbDenyRead 15.9

時間的な違いはほんのわずかですが、おおむね予想通り、他のユーザーとの排他制御のレベルによって処理時間に違いが出たようです。ただ、dbReadOnlyなどは自分自身でもレコードの更新ができなくなるわけで、更新や追加のために準備しておく何らかの内部処理が不必要となる分、処理が速くなることも考えていたのですが、その効果はまったくないようです。もちろん、時間が短ければよいというものではなく、データの整合性などを考慮して、自分が読み込み中は一切他のユーザーは編集されては困るという場合もあるわけですから、これらの定数はそういった排他制御のため、あるいはレコードの編集に対する権限を明示的にする目的のもののようです。

ODBCのリンクテーブルの場合にはもしかしたらもう少し顕著な違いが現れるかもしれませんが、ローカルテーブルの場合にも非常に微少ながら「JETデータベースエンジンでは OpenRecordset メソッドのパラメータに dbReadOnly などを使用すると読み込み時間が若干長くなる。」ようです。

| Index | Prev | Next |

 

Copyright © T'sWare All rights reserved