Nat*_*han 16 vb.net sql-server performance
我试图从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
Run Code Online (Sandbox Code Playgroud)
ang*_*son 20
使用SqlBulkCopy类,它将能够比单个插入更快地运行这些100K行.
哦,如果可以,我会敦促你实现一个支持IDataReader的类,以提供SqlBulkCopy.WriteToServer(IDataReader)方法,这将允许你按顺序生成数据,一次一行.如果从文本文件导入,作为示例,构建一些IEnumerable<T>使用yield return并将其转换为IDataReader对象的方法将允许您非常自然地将数据提供给服务器.
为了通过BCP来抵消回滚能力的损失,您可以将数据传输到临时表中,然后INSERT INTO在服务器上执行正常语句,将数据从临时表批量传输到生产表中,这样您就可以使用了最后一个转移部分的事务,并且仍然比原始的单个插入语句运行得快得多.
编辑:这是一个使用批量加载API 的例子(C#,但应该很容易转换为VB.Net).
Nat*_*han 12
感谢大家的帮助,我完成了我的任务.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
Run Code Online (Sandbox Code Playgroud)
我找到了非常有用的链接:
感谢大家的帮助!我真诚地感激它.
| 归档时间: |
|
| 查看次数: |
22835 次 |
| 最近记录: |