#01 レコード追加時の OpenRecordset メソッドのパラメータを試す

結論
JETデータベースエンジンでは OpenRecordset メソッドのパラメータに dbAppendOnly を使用してもしなくても処理時間に影響はない。

AccessでVBAを使っている人なら OpenRecordset メソッドはもうおなじみでしょう。 しかし頻繁に使うがゆえに、CurrentDb 関数とセットで OpenRecordset メソッドも何気なく使っていることが多くないでしょうか?。このメソッドは先頭のパラメータにテーブル名やクエリー名(またはSQL文)さえ指定してやれば問題なく動作します。しかしよく見るとこのメソッドにはそれ以外にもいくつかパラメータが存在しています。ここではテーブルに"レコード追加"する場合にそれらのパラメータが及ぼす影響をテストしてみたいと思います。具体的には定数 dbAppendOnly の有無によるレコード追加時間の比較を行います。

まずテストに入る前に OpenRecordset メソッド の構文を確認しておきましょう。

    Set recordset = object.OpenRecordset(source, type, options, lockedits)

今回テストするパラメータは options に指定する定数の1つである dbAppendOnly です。これは、「レコードセットに追加はできるが既存のレコードの更新や削除はできない」というものです。

テストの概要としては、ID(オートナンバー型)、Data1(テキスト型)、Data2(テキスト型)の3つのフィールドから構成されるテーブルに、新規レコード5万件を追加する処理を実行し、その時間を測定します。基本的なテストコードは次のようなものです。

  Dim dbs As Database
  Dim rst As Recordset
  Dim ilngLoop As Long
  Const clngRecMax As Long = 50000

  Set dbs = CurrentDb
  ts_watch "テスト開始", True
  Set rst = dbs.OpenRecordset("TestData")・・・・・・条件を変えてみる部分
     'Set rst = dbs.OpenRecordset("TestData", , dbAppendOnly)
  With rst
    For ilngLoop = 1 To clngRecMax
        .AddNew
        !Data1 = "ABCDEFG"
        !Data2 = "123456"
        .Update
    Next ilngLoop
    .Close
  End With
  ts_watch "テスト完了"

テストパターンとしては、上記の OpenRecordset で dbAppendOnly を使用した場合と使用しない場合、さらにテーブルが空の状態とすでに10万件のレコードがある状態、テーブルではなく2つのテーブルを結合したクエリーを対象とした場合やリンクテーブルを対象とした場合などの組み合わせで行います。 


そして、テスト結果はつぎのようなものになりました。
TestDataの内容 既存レコード数 dbAppendOnly の有無 実行時間(秒)
テーブル ゼロ なし 52
あり 54
10万件 なし 54
あり 54
クエリー ゼロ なし 94
あり 93
10万件 なし 107
あり 107
リンクテーブル ゼロ なし 76
あり 77
10万件 なし 79
あり 81
  この結果からは dbAppendOnly の有無による大きな違いは見当たりません。すでに10万件のレコードがある場合には、dbAppendOnly を使用することによって既存のレコードにカレントレコードが戻ることはないと宣言している訳ですから、何からの時間的影響があるだろうと予想したのですが、実際にはなく、これは既存レコード数が100万件の場合でも同じでした。さらに、今回のように5万件のレコードをまとめて追加するのではなく、既存レコード数100万件に対して数件のレコードを追加するだけの場合にも違いは現れませんでした。
 
どうやら dbAppendOnly はレコードに対して編集や削除を行わないことを明示的に記述する程度のもののようです。ODBCのリンクテーブルの場合にはもしかしたらもう少し顕著な違いが現れるかもしれませんが、少なくても「JETデータベースエンジンでは OpenRecordset メソッドのパラメータに dbAppendOnly を使用してもしなくても処理時間に影響はない。」と言えそうです。
| Index | Prev | Next |

 

Copyright © T'sWare All rights reserved