【发布时间】:2016-01-05 14:07:37
【问题描述】:
我使用的是 MS Access 2010,分为前端/后端;在具有 16 个以上表的网络驱动器 (WAN) 上,其中一个表 用户(130 万) 主要用于用户信息,不插入大量其他表,将接收 每天最多 2000 多个插入。
我已经能够优化大多数读取/选择查询。虽然我的代码的 1 块如下所示。这可以用于每天最多 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
我的目标是减少对数据库的调用次数以插入所有值。并且 MS ACCESS 不支持在一个语句中包含超过 1 个查询,正如我在代码的注释部分中所尝试的那样。我也认为记录集更新方法非常耗时,如果有人可以提出更好的更新记录集的方法。
是否我可以通过 SQL 查询或任何其他访问功能欺骗 Access 在 对 db 的点击次数较少 中插入和更新。或者无论如何优化,它可能需要长达 30 分钟的时间。将其减少到至少 2 - 5 分钟是合适的。
附: 我无法切换到 SQL Server,这是不可能。我知道它可以通过 sql server 以更优化的方式完成,并且 Access 不应该用于 WAN,但我没有那个选项。
解决方案: 我选择了 Andre 和 Jorge 的解决方案。时间减少了17倍。虽然阿尔伯特的回答也是正确的,因为我发现我的主要问题是循环中的 sql 语句。将记录集中的编辑更改为 sql 对时间因素影响不大。
【问题讨论】:
-
您应该使用插入选择查询。将
REC查询与INSERT INTO TransportationDetails ( TransportationId, SomeId) select " & vTransportationId & ", someId from rectable where ....之类的插入查询结合使用,您只需调用一次此插入 -
我有一个访问查询,它是“rec”记录集的记录集。我可以运行这个查询的select语句,还是我必须重写这个sql语句中的查询?
-
如果你在其他地方使用它,你必须为插入创建一个新的,但如果它只存在于这个插入中,你只需要一个作为下面给出的答案,根据我的建议。
-
感谢cmets的提示。性能提升了 17 倍。
标签: sql ms-access insert ms-access-2010 query-performance