我正在使用MS Access 2010,分为前端/后端;在具有16+表的网络驱动器(WAN)上,其中一个表用户(130万),主要用于用户信息,并且不会插入很多其他表,这些表将接收每天最多插入2000+ 。
我已经能够优化大多数读/选查询。虽然我的代码的一大块如下所示。这可以每天用于2000次迭代。
Do Until rec.EOF
Dim vSomeId As Integer
vSomeId = rec!SomeId
'StrSQL = StrSQL & "INSERT INTO TransportationDetails ( TransportationId, SomeId)" & _
'"VALUES(" & vTransportationId & ", " & vSomeId & ");"
StrSQL = "INSERT INTO TransportationDetails ( TransportationId, SomeId)" & _
"VALUES(" & vTransportationId & ", " & vSomeId & ");"
DoCmd.SetWarnings False
DoCmd.RunSQL (StrSQL)
DoCmd.SetWarnings True
rec.Edit
rec!SomeBoolean = rec!SomeOtherBoolean
rec.Update
rec.MoveNext
Loop
我的目标是减少对db的调用次数以插入所有值。并且 MS ACCESS不支持在语句中进行多于1个查询,正如我在代码的注释部分中尝试的那样。我还认为记录集upate方法耗费大量时间,如果有人能提出更新记录集的更好方法。
是有什么方法可以让访问插入&通过SQL查询或任何其他访问功能更新更少的命中数。或者无论如何优化,有时可能需要长达30分钟。减少到至少2-5分钟是合适的。
P.S。 我无法切换到SQL Server,它 JUST NOT SUSIBLE 。我知道它可以通过SQL服务器以更优化的方式完成,Access不应该用于WAN,但我没有这个选项。
解决方案: 我选择了安德烈和豪尔赫的解决方案。时间减少了17倍。虽然Albert的答案也是正确的,因为我发现我的主要问题是循环中的sql语句。将记录集中的编辑更改为sql并不会对时间因素产生太大影响。
答案 0 :(得分:7)
我应该指出,在插入行的情况下,您会发现使用记录集可以提高FAR性能。如果您对一组数据进行操作,SQL“操作”查询只会执行得更好。您插入行的那一刻,那么您没有“设置”插入,并且使用DAO记录集将导致更好的性能(比10到100倍更好)。
答案 1 :(得分:4)
如果你现在有
S = "SELECT SomeId, SomeBoolean, SomeOtherBoolean " & _
"FROM recTable WHERE someCriteria"
Set rec = DB.OpenRecordset(S)
将您的陈述改为
"INSERT INTO TransportationDetails (TransportationId, SomeId) " & _
"SELECT " & vTransportationId & ", SomeId " & _
"FROM recTable WHERE someCriteria"
和
"UPDATE recTable SET SomeBoolean = SomeOtherBoolean WHERE someCriteria"
为了提高性能,尽可能避免在Recordset上循环。使用对整个集合进行操作的SQL语句。
答案 2 :(得分:0)
我最近遇到了一个问题,我必须每6小时将200,000条记录导入到12个Access表中。只要我一次插入每条记录,这花了很长时间。
我从一位建议使用链接表的同事那里得到了一个提示。
因此,我在Access数据库中设置了一个链接表,该表已链接到以分号分隔的文本文件。
然后我的程序每6小时创建一个以分号分隔的文本文件。
然后从链接表中选择所需的表,然后创建该表。
这极大地加快了我的处理过程,我绝对会建议您选择它。