【发布时间】:2019-01-03 03:31:34
【问题描述】:
我正在使用 VBA 字典在 Access 中执行“更新插入”。我正在循环我的字典键,如果该键存在于 Access 表中,那么我将更新它。如果没有,它会插入它。然而,我的表包含 200k+ 行,这使得代码执行速度非常慢(例如,5 分钟甚至 5% 都没有完成),因为迭代需要在整个表中搜索“LOC”(我的键)。
有没有办法让我显着加快这个过程? 我的代码如下,感谢任何帮助。
Sub UpdateDatabase(dict As Object)
Dim db As Database
Dim rs As DAO.Recordset
Set db = OpenDatabase("C:\XXX\myDB.accdb")
Set rs = db.OpenRecordset("MyTable", dbOpenDynaset)
For Each varKey In dict.Keys()
'Table is searched for key
rs.FindFirst "[LOCID] = '" & varKey & "'"
If rs.NoMatch Then
'If the key was not found, insert it
rs.AddNew
rs!LOCID = varKey
rs![Status] = "To Start"
rs.Update
Else
'If the key was found, update its status
rs.Edit
rs![Status] = "Done"
rs.Update
End If
Next
rs.Close
db.Close
Application.StatusBar = False
End Sub
编辑:
我在上面的代码中发现了瓶颈。这是行:
rs.FindFirst "[LOCID] = '" & varKey & "'"
这用于查找密钥是否在数据库中。删除它(并简单地插入新数据)加快了这个过程,并且在几秒钟内完成。有没有一种快速的方法来确定一个值是否已经在一个表中?
【问题讨论】:
-
您可以定期调用 UpdateBatch,而不是每次更改后...您的字典中有多少条目?
-
@TimWilliams 我发现性能瓶颈实际上并不在于添加数据,而在于确定该值是否已在表中的代码。我已经编辑了我的问题。
-
Upserting in MS-access 的可能重复项。请参阅描述查询连接表的答案。
-
@June7 我相信我所针对的方法不同,足以保证提出一个新问题。我的目标是使用 DAO 提高性能。
-
DAO 循环将比查询慢得多。如果需要性能,请使用查询,否则,如果是教程示例或性能实验,请确保键列有索引并使用
Seek方法而不是FindFirst