【发布时间】:2013-03-25 04:24:17
【问题描述】:
这是this thread 的后续行动。这就是 .Net 2.0 的全部内容;至少对我来说。
基本上,Marc(来自上面的 OP)尝试了几种不同的方法来更新具有 100,000 条记录的 MS Access 表,并发现使用 DAO 连接比使用 ADO.Net 大约快 10 到 30 倍。我走了几乎相同的路径(下面的示例)并得出了相同的结论。
我想我只是想了解 为什么 OleDB 和 ODBC 慢得多,我很想知道是否有人找到了比 DAO 更好的答案自 2011 年那篇文章以来。我真的更愿意避免使用 DAO 和/或自动化,因为它们将要求客户端计算机具有可再分发的 Access 或数据库引擎(或者我坚持使用不支持的 DAO 3.6支持.ACCDB)。
最初的尝试; 100,000 条记录/10 列约 100 秒:
Dim accessDB As New OleDb.OleDbConnection( _
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
accessPath & ";Persist Security Info=True;")
accessDB.Open()
Dim accessCommand As OleDb.OleDbCommand = accessDB.CreateCommand
Dim accessDataAdapter As New OleDb.OleDbDataAdapter( _
"SELECT * FROM " & tableName, accessDB)
Dim accessCommandBuilder As New OleDb.OleDbCommandBuilder(accessDataAdapter)
Dim accessDataTable As New DataTable
accessDataTable.Load(_Reader, System.Data.LoadOption.Upsert)
//This command is what takes 99% of the runtime; loops through each row and runs
//the update command that is built by the command builder. The problem seems to
//be that you can't change the UpdateBatchSize property with MS Access
accessDataAdapter.Update(accessDataTable)
无论如何,我觉得这很奇怪,所以我尝试了几种相同的口味:
- 为 ODBC 切换 OleDB
- 循环遍历数据表并为每一行运行 INSERT 语句
- 这就是 .Update 的作用
- 使用 ACE 提供程序而不是 Jet(ODBC 和 OleDB)
- 从 DataReader.Read 循环中运行数据适配器更新
- 出于沮丧;太搞笑了。
最后,我尝试使用 DAO。代码基本上应该做同样的事情;但显然不是,因为它会在大约 10 秒内运行。
Dim dbEngine As New DAO.DBEngine
Dim accessDB As DAO.Database = dbEngine.OpenDatabase(accessPath)
Dim accessTable As DAO.Recordset = accessDB.OpenRecordset(tableName)
While _Reader.Read
accessTable.AddNew()
For i = 0 To _Reader.FieldCount - 1
accessTable.Fields(i).Value = _Reader.Item(i).ToString
Next
accessTable.Update()
End While
其他几点说明:
- 所有示例中的所有内容都转换为字符串,以尽量保持简单和一致
- 异常:在我的第一个示例中,我不使用 Table.Load 函数,因为...好吧,我真的不能,但是当我循环浏览阅读器并构建插入命令时,我做了基本相同的事情(无论如何,这就是它正在做的事情)。它没有帮助。
- 对于每个字段...Next vs. Field(i) vs. Field(name) 对我来说没有区别
- 我运行的每个测试都从一个新压缩的 Access 数据库中的空的预构建数据表开始
- 将数据读取器加载到内存中的数据表大约需要 3 秒
- 我认为封送数据不是问题,因为 Marc 的帖子表明通过自动化加载文本文件的速度与 DAO 一样快——如果有的话,它不应该在使用 ODBC/OleDB 时封送数据,但它应该在使用自动化时
- 所有这一切都让我感到不安,因为它没有任何意义
希望有人能够对此有所了解……这很奇怪。 提前致谢!
【问题讨论】:
标签: .net performance ms-access ado.net dao