ADO加速打开表访问

时间:2013-04-16 10:28:24

标签: ms-access vb6 ado

根据写入数据的速度,为rs.AddNew和rs.Update打开带有ADO和Access的表的最佳方法是什么?

我是否需要使用特定光标或特定方法?

我使用从VB6到Jet的ADO连接。

1 个答案:

答案 0 :(得分:3)

我的两个建议是:

  1. 将记录集打开为adOpenStatic,以尽量减少尝试跟踪其他用户可能对表所做更改的开销。

  2. 通过在批量插入之前执行.AddNew,然后在cn.BeginTrans之后执行多个cn.CommitTrans操作。

  3. 修改

    回应@ 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.