1

データの書き込み速度に基づいて、rs.AddNew と rs.Update について、ADO と Access でテーブルを開く最良の方法は何ですか?

特定のカーソルまたは特定のメソッドを使用する必要がありますか?

VB6 から Jet への ADO 接続を使用します。

4

1 に答える 1

3

私の2つの提案は次のとおりです。

  1. adOpenStatic他のユーザーがテーブルに加えた可能性のある変更を追跡するためのオーバーヘッドを最小限に抑えるために、Recordset を開きます。

  2. 挿入のバッチの前と後で.AddNew実行することにより、複数の操作をトランザクションにラップします。cn.BeginTranscn.CommitTrans

編集

@ Bob77 からのコメントに応えて、彼は次のように述べています。

一連の任意の更新操作の周りに Begin/End Trans をスローしても、本質的なパフォーマンス上の利点は得られず、ほとんどの場合、事態はさらに悪化します。

次の VBScript のテスト結果は、Jet/ACE データベースを操作するときに、挿入のバッチをトランザクションにラップするとパフォーマンスが大幅に向上することを明確に示しています。

Option Explicit
Dim con, rst, t0, i, n, s
Const adUseClient = 3
Const adOpenStatic = 3
Const adLockOptimistic = 3
Const useTransaction = False

t0 = Timer
n = 1000
Set con = CreateObject("ADODB.Connection")
con.CursorLocation = adUseClient
con.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Y:\adoTimeTest.accdb;"
Set rst = CreateObject("ADODB.Recordset")
rst.Open "SELECT * FROM tbl", con, adOpenStatic, adLockOptimistic
If useTransaction Then
    con.BeginTrans
End If
For i = 1 to n
    rst.AddNew
    rst("ItemName").Value = "Item_" & i
    rst("SeqNo").Value = i
    rst.Update
Next
If useTransaction Then
    con.CommitTrans
End If
rst.Close
Set rst = Nothing
con.Close
Set con = Nothing
s = "Added " & n & " rows in " & Round(Timer - t0, 1) & " seconds with"
If Not useTransaction Then
    s = s & "out"
End If
s = s & " transaction."
Wscript.Echo s

テーブル[tbl]の構造は

ID       - AutoNumber, Primary Key
ItemName - Text(255), Indexed (duplicates OK)
SeqNo    - Long Integer, Indexed (no duplicates)

テスト 1: useTransaction = False

[tbl] テーブルは空で、.addcb ファイルは新たに圧縮されています。

Y:\>cscript /nologo adoTimeTest.vbs
Added 1000 rows in 103.9 seconds without transaction.

テスト 2: useTransaction = True

[tbl] テーブルが空になり、.addcb ファイルが再び新たに圧縮されました。

Y:\>cscript /nologo adoTimeTest.vbs
Added 1000 rows in 4.9 seconds with transaction.

編集

@ Bob77 からのフォローアップ コメントに応じて:

排他的アクセスのためにデータベースをもう一度開いてみます。

ODBC および排他的アクセスを使用した追加のテスト:

con.Open "Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=Y:\adoTimeTest.accdb;Exclusive=1;Uid=admin;Pwd=;"

テスト 3: useTransaction = False

[tbl] テーブルは空で、.addcb ファイルは新たに圧縮されています。

Y:\>cscript /nologo adoTimeTest.vbs
Added 1000 rows in 26.5 seconds without transaction.

テスト 4: useTransaction = True

[tbl] テーブルが空になり、.addcb ファイルが再び新たに圧縮されました。

Y:\>cscript /nologo adoTimeTest.vbs
Added 1000 rows in 6.1 seconds with transaction.
于 2013-04-16T11:03:51.690 に答える