首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ADO加速打开表访问

ADO加速打开表访问
EN

Stack Overflow用户
提问于 2013-04-16 10:28:24
回答 1查看 2.7K关注 0票数 1

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

我需要使用特定的游标还是特定的方法?

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

EN

回答 1

Stack Overflow用户

发布于 2013-04-16 11:03:51

我的两项建议是:

  1. adOpenStatic的形式打开记录集,以尽量减少试图跟踪其他用户可能对表进行的更改的开销。
  2. 在一个事务中包装多个.AddNew操作,方法是在一批插入之前执行cn.BeginTrans,然后执行cn.CommitTrans

编辑

在回应@Bob77的评论时,他说:

在一系列任意的更新操作中抛出开始/结束遍历并不能提供任何内在的性能好处,而且在大多数情况下应该会使事情变得更糟。

下面的VBScript测试结果清楚地表明,在使用Jet/ACE数据库时,在事务中包装一批插入可以极大地提高性能。

代码语言:javascript
复制
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的结构是

代码语言:javascript
复制
ID       - AutoNumber, Primary Key
ItemName - Text(255), Indexed (duplicates OK)
SeqNo    - Long Integer, Indexed (no duplicates)

测试1: useTransaction = False

tbl表为空,.addcb文件刚刚压缩。

代码语言:javascript
复制
Y:\>cscript /nologo adoTimeTest.vbs
Added 1000 rows in 103.9 seconds without transaction.

测试2: useTransaction = True

tbl表已经清空,.addcb文件已经重新压缩。

代码语言:javascript
复制
Y:\>cscript /nologo adoTimeTest.vbs
Added 1000 rows in 4.9 seconds with transaction.

编辑

针对@Bob77 77的后续评论:

我会再次尝试打开数据库进行独占访问。

使用ODBC和独占访问的其他测试:

代码语言:javascript
复制
con.Open "Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=Y:\adoTimeTest.accdb;Exclusive=1;Uid=admin;Pwd=;"

测试3: useTransaction = False

tbl表为空,.addcb文件刚刚压缩。

代码语言:javascript
复制
Y:\>cscript /nologo adoTimeTest.vbs
Added 1000 rows in 26.5 seconds without transaction.

测试4: useTransaction = True

tbl表已经清空,.addcb文件已经重新压缩。

代码语言:javascript
复制
Y:\>cscript /nologo adoTimeTest.vbs
Added 1000 rows in 6.1 seconds with transaction.
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16034708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档