批量插入Sql Server

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秒.我简直不敢相信!

供将来参考,以下是一些信息:

  • 要使用SQL批量复制,您的数据必须采用DataSet,DataReader或DataTable的形式.也允许一些XML.

基本实施代码:

    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)

我找到了非常有用的链接:

使用Sql批量复制

感谢大家的帮助!我真诚地感激它.