批量插入到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秒。 我简直不敢相信!

为了将来的参考,以下是一些信息:

  • 要使用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
    

    非常丰富的链接,我发现:

    使用Sql批量复制

    感谢所有人的帮助! 我衷心感谢。


    将数据导入到csv文件并对数据运行bcp实用程序。 顺序调用一次只能插入一行,你无法获得更快的速度,如果你需要性能,你肯定需要一个批量工具。

    SQLBulkCopy类将允许您传输集合中的所有数据,以便服务器可以一次处理所有内容,消除来回。 所以,如果你想避免创建临时文件(我会),然后看看那个类。

    只要连接保持打开状态是一个好的开始,但是您仍然有发送行的开销,让SQL存储它,返回结果,然后您必须迭代到下一行。

    链接地址: http://www.djcxy.com/p/95647.html

    上一篇: Mass Insert Into Sql Server

    下一篇: How to change only body color?