增加Ms访问插入效果

时间:2015-10-08 05:46:11

标签: sql ms-access insert ms-access-2010 query-performance

我正在使用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并不会对时间因素产生太大影响。

3 个答案:

答案 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小时创建一个以分号分隔的文本文件。

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

这极大地加快了我的处理过程,我绝对会建议您选择它。