根据写入数据的速度,为rs.AddNew和rs.Update打开带有ADO和Access的表的最佳方法是什么?
我是否需要使用特定光标或特定方法?
我使用从VB6到Jet的ADO连接。
答案 0 :(得分:3)
我的两个建议是:
将记录集打开为adOpenStatic
,以尽量减少尝试跟踪其他用户可能对表所做更改的开销。
通过在批量插入之前执行.AddNew
,然后在cn.BeginTrans
之后执行多个cn.CommitTrans
操作。
回应@ Bob77的评论,他说:
围绕一系列任意更新操作投掷开始/结束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.