提高 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。

这使我的流程大大加快,我肯定会建议将其作为一个选项。