【发布时间】:2016-04-25 11:47:40
【问题描述】:
我有一段代码创建一个新表,然后尝试将记录集值复制到表中。唯一的问题是它非常慢,并且在执行下面的插入部分时访问会显示加载符号。目前这个问题正在发生插入 500 条记录,但是当我获得最终数据集时,我需要插入大约 10,000 到 20,000 条记录。
I = 1
DoCmd.SetWarnings False
RecordSet1.MoveFirst
Do While Not RecordSet1.EOF = True
SQL = "INSERT INTO " & FullName & " ("
For Each field In RecordSet1.fields()
SQL = SQL & " " & Replace(field.Name, ".", "_") & ","
Next field
SQL = SQL & "ValidationCheck)"
SQL = SQL & " VALUES("
For Each field2 In RecordSet1.fields()
SQL = SQL & "'" & field2.Value & "',"
Next field2
SQL = SQL & Matches(I) & ")"
DoCmd.RunSQL (SQL)
RecordSet1.MoveNext
I = I + 1
Loop
我想知道的是,有什么办法可以加快速度吗?还是有更好的方法? (我想要做的是在运行时创建一个表,其中包含来自 RecordSet 的一组唯一字段,并添加一个额外的列,其中包含存储在 Match 数组中的每个 Record 的布尔值)。创建工作正常,但是上面的插入代码很慢。
【问题讨论】:
-
如果使用 VBA 的性能太慢,我会尝试创建一个已保存的查询。如果您可以用纯 SQL 编写此代码,Access 将保存查询计划,您应该会看到更好的性能。
-
嗨,马克,感谢您的建议。我实际上已经尝试过了,它在一定程度上提高了性能。当然,我正在失去表结构的灵活性。您有任何进一步的性能提升想法吗?
-
我会尽你所能来准备数据和/或表格,并尽量减少循环/字符串操作。我也不确定
Matches(I)是什么。您能否设置一个计时器并查看性能影响实际发生的位置? -
ADO 不是更快吗?