使用 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 时的性能问题的主要内容,如果未能解决你的问题,请参考以下文章

ADO 查询导致 mdb 数据库超过 2GB 限制

通过 ADO 将没有标题的 CSV 文件导入 VBA

使用 CSV Importer 插件将大型 CSV 导入 Wordpress

使用 Powershell 将大型 CSV 批量导入 SQL Server

将大型 .csv 文件导入 Excel,

如何快速将大型 CSV 文件导入数据库