我需要使用VB6和MS Access数据库处理数十万条记录.我遍历记录集并编辑每条记录.但是这需要很多时间.使用Addnew和Update方法创建具有相同数量记录的数据库的速度要快得多.
如果有人向我展示任何代码示例或仅仅是策略,我将不胜感激.
这是代码
Data1(1).RecordSource = "Select * from TABLE order by Field_A ASC"
Data1(1).Refresh
If Data1(1).Recordset.RecordCount > 0 Then
Data1(1).Recordset.MoveFirst
Do
Data1(1).Recordset.Edit
Data1(1).Recordset.Fields("FIELD") = Sort_Value
Data1(1).Recordset.Update
Data1(1).Recordset.MoveNext
Loop Until Data1(1).Recordset.EOF = True
End If
Run Code Online (Sandbox Code Playgroud)
这真的很简单.真实的是,我忘了提到,计算机的硬盘驱动器不断发出红色/写入.这实际上是问题所在.如此沉重的负载,无法不影响性能.
我首先想到的是查询生成的记录集,请记住我们有1-2万条记录,导致这个问题.我想它存在于硬盘驱动器和RAM中的一些临时位置.因此,执行.Edit和.Update可能是首先将光标定位在正确位置然后写入的问题.
不确定.可能会有一位专家向我展示出一条出路.
顺便说一句.我还尝试用固定长度循环替换Loop Until Data1(1).Recordset.EOF = True语句,因为我也读过,这次检查Recordset.EOF也会降低性能.
先感谢您!
我创建了一个名为的表,其中包含test字段n和f(n)
定时 3 个不同的更新子例程 - 没有事务的记录集 - 有事务的记录集 - 更新查询
Sub updateFunction_noTrans()
Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("test")
rs.MoveFirst
Do Until rs.EOF
rs.Edit
rs("f(n)") = rs("n") + 1
rs.Update
rs.MoveNext
Loop
End Sub
Run Code Online (Sandbox Code Playgroud)
这基本上就是您正在做的事情,编辑字段时的直接记录集
Sub updateFunction_yesTrans()
Dim i As Long
Dim commitSize As Long
Dim rs As Recordset
commitSize = 5000
Set rs = CurrentDb.OpenRecordset("test")
DBEngine.Workspaces(0).BeginTrans
rs.MoveFirst
Do Until rs.EOF
rs.Edit
rs("f(n)") = rs("n") + 1
rs.Update
rs.MoveNext
i = i + 1
If i = commitSize Then
DBEngine.Workspaces(0).CommitTrans
DBEngine.Workspaces(0).BeginTrans
i = 0
End If
Loop
DBEngine.Workspaces(0).CommitTrans
End Sub
Run Code Online (Sandbox Code Playgroud)
这是相同的想法,但涉及交易。我一次提交 5000 条记录,因为每次提交有 9k-10k 左右的限制。我相信您可以通过进入注册表来编辑它。
Sub updateFunction_updateQuery()
CurrentDb.Execute ("UPDATE test SET test.[f(n)] = [n]+1;")
End Sub
Run Code Online (Sandbox Code Playgroud)
这比任何记录集方法都要快。例如,在大约 200 万条记录上,没有事务的情况下大约需要 20 秒,有事务的情况大约需要 18-19 秒,有更新查询的情况大约需要 14 秒。
这一切都是假设要更新的字段取决于从该记录中的其他恶魔计算的值
要真正加快此类行动,有时取决于具体情况,如果不适用,则需要更多细节。
编辑:使用旧的 core 2 duo 机器 + 字段上没有索引