批量插入到SQL Server中
我试图从Vb.Net中将大量记录插入到SQL Server 2005中。 虽然插入工作正常,但我尽我所能努力尽快完成。 目前,100,000条记录需要大约11分钟。 从应用程序中将大量记录插入SQL Server的建议方法是什么?
我目前的apporach基本上是打开连接,遍历我的信息列表,并发射个别的sql插入语句,然后关闭连接。 任何人有更好的建议如何做到这一点?
当前功能:
Public Sub BatchInsert(ByVal ParamCollections As List(Of SqlParameter()))
Dim Conn As SqlConnection = New SqlConnection(DBHelper.DatabaseConnection)
Using scope As TransactionScope = New TransactionScope()
Using Conn
Dim cmd As SqlCommand = New SqlCommand("sproc_name", Conn)
Conn.Open()
cmd.CommandType = CommandType.StoredProcedure
For i = 0 To ParamCollections.Count - 1
cmd.Parameters.Clear()
cmd.Parameters.AddRange(ParamCollections(i))
cmd.ExecuteNonQuery()
Next
Conn.Close()
scope.Complete()
End Using
End Using
End Sub
使用SqlBulkCopy类,它将能够遍历100K行,比单独的插入更快。
呵呵,如果可以的话,我会敦促你实现一个支持IDataReader的类,以提供SqlBulkCopy.WriteToServer(IDataReader)方法,这将允许你按顺序产生一行数据,一次一行。 例如,如果您从文本文件导入,则构建一些使用yield return
并将其转换为IDataReader对象的IEnumerable<T>
方法将允许您非常自然地向服务器提供数据。
为了对付BCP的回滚能力的损失,可以将数据传输到临时表中,然后在服务器上执行普通的INSERT INTO
语句,然后将临时表中的数据批量传输到生产表中,这将允许您为最后一个传输部分使用一个事务,并且运行速度仍然比原来的单个插入语句快得多。
编辑:这里是一个例子(C#,但应该很容易转换为VB.Net)的大容量加载API的使用。
感谢大家的帮助,我完成了我的任务。 SQLBulkCopy完全符合我的需求(虽然还有其他一些很好的建议)。 使用SqlBulkcopy,时间从11分钟到45秒。 我简直不敢相信!
为了将来的参考,以下是一些信息:
基本实施代码:
Public Sub PerformBulkCopy(ByVal dt As DataTable)
Using Conn As SqlConnection = New SqlConnection(DBHelper.DatabaseConnection)
Conn.Open()
Using s As SqlBulkCopy = New SqlBulkCopy(Conn)
s.DestinationTableName = "TableName"
s.WriteToServer(dt)
s.Close()
End Using
Conn.Close()
End Using
End Sub
非常丰富的链接,我发现:
使用Sql批量复制
感谢所有人的帮助! 我衷心感谢。
将数据导入到csv文件并对数据运行bcp实用程序。 顺序调用一次只能插入一行,你无法获得更快的速度,如果你需要性能,你肯定需要一个批量工具。
SQLBulkCopy类将允许您传输集合中的所有数据,以便服务器可以一次处理所有内容,消除来回。 所以,如果你想避免创建临时文件(我会),然后看看那个类。
只要连接保持打开状态是一个好的开始,但是您仍然有发送行的开销,让SQL存储它,返回结果,然后您必须迭代到下一行。
链接地址: http://www.djcxy.com/p/95647.html