使用 ADO 将大型 csv 文件导入 mdb 时的性能问题

Posted

技术标签:

【中文标题】使用 ADO 将大型 csv 文件导入 mdb 时的性能问题【英文标题】:performance issues when importing large csv file into mdb using ADO 【发布时间】:2014-01-20 17:05:23 【问题描述】:

这是我的代码,但将所有 1700 万行导出到 mdb 大约需要一个小时。我不能为此目的使用 mysql 或 sql server。我必须在访问数据库中执行此操作,并且很快因为这个过程每周运行一次。请建议可用于此任务的最快方法

Sub insertDataIntoMDB()
 Dim Dbfilepath As String
 Set cnn = CreateObject("ADODB.Connection")
 Set rs = CreateObject("ADODB.Recordset")
 Set rst = CreateObject("ADODB.Recordset")

        Dim arrData() As String
        Dim s As String
        Dim i As Integer


        Dbfilepath = ThisWorkbook.Path & "\DB\Interface.accdb"
        cnn.Open "Provider= Microsoft.ACE.OLEDB.12.0;" & " Data Source=" & Dbfilepath & ";" & "Persist Security Info =False;"

        q1 = "DELETE * FROM MYTABLE"
        Set rs = cnn.Execute(q1)

        'q1 = "ALTER TABLE MyTable ALTER COLUMN ID autonumber(1,1)"
        'Set rs = cnn.Execute(q1)

        p = UserForm1.csvFolder & "\" & sItem & ".csv"

        Open p For Input As #1
        Do While Not EOF(1)

          Close #1


            Line Input #1, s
            arrData = Split(s, ",")
           q1 = "INSERT INTO MyTable(F1,F2,F3) values(" & arrData(0) & "," & arrData(1) & "," & arrData(2) & ")"
           Set rst = cnn.Execute(q1)
        Loop
        Close #1
        rs.Close
        rs`enter code here`t.Close
        Set rst = Nothing
        cnn.Close
        Set rs = Nothing
        Set cnn = Nothing


End Sub

【问题讨论】:

请详细介绍一下您使用的所有表 (MYTABLE) 和 CSV 文件,它们的外观如何? (结构、数据)等 您为什么不希望使用 MS Access?例如。 DoCmd.TransferText ? 【参考方案1】:

在这里你有一个巨大的减速和数据损坏的可能性。

q1 = "INSERT INTO MyTable(F1,F2,F3) values(" & arrData(0) & "," & arrData(1) & "," & arrData(2) & ")"
Set rst = cnn.Execute(q1)

字符串连接很慢,尤其是在 VBA 中。因此,一旦您编写 "something" & "something" 并将其放入循环中,您就是在要求降低性能。

此外,使用 DAO 进行访问通常比使用 ADO 更快。

Read this answerAnd maybe this question and its answers

如果您坚持使用 ADO,您可能希望使用 SELECT 语句打开一个记录集,然后将您的数据附加到该记录集,然后调用 UpdateBatch。

You can read more discussion here

祝你好运!

【讨论】:

以上是关于使用 ADO 将大型 csv 文件导入 mdb 时的性能问题的主要内容,如果未能解决你的问题,请参考以下文章