提高 Ms Access 插入性能
Increase Ms Access Insert Performance
我正在使用 MS Access 2010,分为前端/后端;在网络驱动器 (WAN) 上,有 16+ table 和 用户中的一个 table(130 万),主要用于用户信息,插入量不大和少数其他 table,它们每天会收到 多达 2000+ 次插入 。
我已经能够优化大多数 read/select 查询。尽管我的代码的 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
我这里的objective是为了减少对db插入所有值的调用次数。 MS ACCESS 不支持在语句 中有超过 1 个查询,正如我在代码的注释部分中尝试的那样。我也觉得recordset upate的方法比较耗时,有哪位大神可以推荐一个更好的recordset更新方法
是 有什么方法可以通过 SQL 查询在 较少命中 db 中欺骗访问以插入和更新,或任何其他访问功能。或者以任何方式进行优化,有时可能需要 30 分钟。减少到至少 2 - 5 分钟是合适的。
P.S。
我无法切换到 SQL 服务器,它 不可能 。我知道它可以通过 sql 服务器以更优化的方式完成,并且 Access 不应该用于 WAN,但我没有那个选项。
解决方法:
我选择了 Andre 和 Jorge 的解决方案。时间减少了 17 倍。尽管艾伯特的答案也是正确的,因为我发现我的主要问题是循环中的 sql 语句。将记录集中的编辑更改为 sql 对时间因素影响不大。
如果你现在有
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"
为了提高性能,请尽可能避免循环记录集。请改用 SQL 对整个集合进行操作的语句。
我应该指出,在插入行的情况下,您会发现使用记录集的性能要好得多。 SQL “动作”查询只有在对一组数据进行操作时才会执行得更好。在插入行的那一刻,您就没有“集合”插入,使用 DAO 记录集会带来更好的性能(好 10 到 100 倍)。
我最近 运行 遇到一个问题,我必须每 6 小时将 200,000 条记录导入到 12 个 Access table 中。这花了太长时间,因为我一次插入每条记录。
我从一位建议使用链接表的同事那里得到了一个提示。
所以我在我的 Access 数据库中设置了一个链接 table,它链接到一个以分号分隔的文本文件。
然后我的程序每 6 小时创建一个以分号分隔的文本文件。
然后您 select 从链接的 table 进入所需的 table 并创建 table。
这使我的流程大大加快,我肯定会建议将其作为一个选项。
我正在使用 MS Access 2010,分为前端/后端;在网络驱动器 (WAN) 上,有 16+ table 和 用户中的一个 table(130 万),主要用于用户信息,插入量不大和少数其他 table,它们每天会收到 多达 2000+ 次插入 。
我已经能够优化大多数 read/select 查询。尽管我的代码的 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
我这里的objective是为了减少对db插入所有值的调用次数。 MS ACCESS 不支持在语句 中有超过 1 个查询,正如我在代码的注释部分中尝试的那样。我也觉得recordset upate的方法比较耗时,有哪位大神可以推荐一个更好的recordset更新方法
是 有什么方法可以通过 SQL 查询在 较少命中 db 中欺骗访问以插入和更新,或任何其他访问功能。或者以任何方式进行优化,有时可能需要 30 分钟。减少到至少 2 - 5 分钟是合适的。
P.S。 我无法切换到 SQL 服务器,它 不可能 。我知道它可以通过 sql 服务器以更优化的方式完成,并且 Access 不应该用于 WAN,但我没有那个选项。
解决方法: 我选择了 Andre 和 Jorge 的解决方案。时间减少了 17 倍。尽管艾伯特的答案也是正确的,因为我发现我的主要问题是循环中的 sql 语句。将记录集中的编辑更改为 sql 对时间因素影响不大。
如果你现在有
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"
为了提高性能,请尽可能避免循环记录集。请改用 SQL 对整个集合进行操作的语句。
我应该指出,在插入行的情况下,您会发现使用记录集的性能要好得多。 SQL “动作”查询只有在对一组数据进行操作时才会执行得更好。在插入行的那一刻,您就没有“集合”插入,使用 DAO 记录集会带来更好的性能(好 10 到 100 倍)。
我最近 运行 遇到一个问题,我必须每 6 小时将 200,000 条记录导入到 12 个 Access table 中。这花了太长时间,因为我一次插入每条记录。
我从一位建议使用链接表的同事那里得到了一个提示。
所以我在我的 Access 数据库中设置了一个链接 table,它链接到一个以分号分隔的文本文件。
然后我的程序每 6 小时创建一个以分号分隔的文本文件。
然后您 select 从链接的 table 进入所需的 table 并创建 table。
这使我的流程大大加快,我肯定会建议将其作为一个选项。