#01 | レコード追加時の OpenRecordset メソッドのパラメータを試す | ||||||||||||||||||||||||||||||||||||||
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 Set dbs = CurrentDb テストパターンとしては、上記の OpenRecordset で dbAppendOnly を使用した場合と使用しない場合、さらにテーブルが空の状態とすでに10万件のレコードがある状態、テーブルではなく2つのテーブルを結合したクエリーを対象とした場合やリンクテーブルを対象とした場合などの組み合わせで行います。 そして、テスト結果はつぎのようなものになりました。 この結果からは dbAppendOnly の有無による大きな違いは見当たりません。すでに10万件のレコードがある場合には、dbAppendOnly を使用することによって既存のレコードにカレントレコードが戻ることはないと宣言している訳ですから、何からの時間的影響があるだろうと予想したのですが、実際にはなく、これは既存レコード数が100万件の場合でも同じでした。さらに、今回のように5万件のレコードをまとめて追加するのではなく、既存レコード数100万件に対して数件のレコードを追加するだけの場合にも違いは現れませんでした。 どうやら dbAppendOnly はレコードに対して編集や削除を行わないことを明示的に記述する程度のもののようです。ODBCのリンクテーブルの場合にはもしかしたらもう少し顕著な違いが現れるかもしれませんが、少なくても「JETデータベースエンジンでは OpenRecordset メソッドのパラメータに dbAppendOnly を使用してもしなくても処理時間に影響はない。」と言えそうです。 |
|||||||||||||||||||||||||||||||||||||||
|
Copyright © T'sWare All rights reserved |