データの書き込み速度に基づいて、rs.AddNew と rs.Update について、ADO と Access でテーブルを開く最良の方法は何ですか?
特定のカーソルまたは特定のメソッドを使用する必要がありますか?
VB6 から Jet への ADO 接続を使用します。
私の2つの提案は次のとおりです。
adOpenStatic
他のユーザーがテーブルに加えた可能性のある変更を追跡するためのオーバーヘッドを最小限に抑えるために、Recordset を開きます。
挿入のバッチの前と後で.AddNew
実行することにより、複数の操作をトランザクションにラップします。cn.BeginTrans
cn.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.