【问题标题】:Increase Ms Access Insert Performance提高 Ms Access 插入性能
【发布时间】: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


【解决方案1】:

我应该指出,在插入行的情况下,您会发现使用记录集的性能要好得多。只有在对一组数据进行操作时,SQL“操作”查询才会执行得更好。在插入行的那一刻,您没有“设置”插入,使用 DAO 记录集将带来更好的性能(提高 10 到 100 倍)。

【讨论】:

  • 好建议(像往常一样)。我刚刚做了一个快速测试,2000 个 SQL INSERT 花费了 24 秒,而 2000 个 DAO.Recordset AddNew 插入到同一个表中花费了不到 0.2 秒。
  • 我使用 1447 插入的标记答案测试了插入,我用了不到 2 秒的时间。我之前的循环方式和每个 1 条 sql 插入语句需要 35 秒。
  • 虽然我是通过记录集编辑那1447条记录,但在将记录集改成单条sql语句后并没有发现任何明显的改进。
  • 以上 cmets 和结果非常符合 Access 社区的一般经验。如前所述,如果您可以使用单个 SQL 语句进行更新,那么您会看到良好的性能,但通常不会比循环+编辑更多。如果您关闭行锁定,那么您将再次获得一些额外的性能提升,而且在进行多次编辑时也会大量减少文件的膨胀。
  • @AlbertD.Kallal 如何关闭行锁定?使用记录集时是否默认关闭?
【解决方案2】:

如果你现在有

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 语句。

【讨论】:

    【解决方案3】:

    我最近遇到了一个问题,我必须每 6 小时将 200,000 条记录导入 12 个 Access 表。这花费了太长时间,因为我一次插入每条记录。

    我从一位建议使用链接表的同事那里得到了一个提示。

    所以我在我的 Access 数据库中设置了一个链接表,该表链接到一个分号分隔的文本文件。

    然后,我的程序每 6 小时创建一个以分号分隔的文本文件。

    然后您从链接表中选择所需的表并创建该表。

    这大大加快了我的流程,我绝对会推荐它作为一个选项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-13
      • 1970-01-01
      • 2021-08-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-24
      • 2021-08-31
      • 1970-01-01
      相关资源
      最近更新 更多