使用 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 时的性能问题的主要内容,如果未能解决你的问题,请参考以下文章
使用 CSV Importer 插件将大型 CSV 导入 Wordpress