在SQL Server中插入100万行的最快方法

这个问题在这里已经有了答案:

  • 将200万行快速插入SQL Server 5个答案

  • 我认为你正在寻找的是大容量插入,如果你更喜欢使用SQL。

    或者还有用于批处理操作的ADO.NET选项,因此您可以将逻辑保存在C#应用程序中。 这篇文章也非常完整。

    更新

    是的,我担心批量插入只能用于导入的文件(来自数据库内)。

    我有一个Java项目的经验,我们需要插入数百万行(数据来自应用程序btw之外)。

    数据库是Oracle,所以我们当然使用Oracle的多行插入。 事实证明,Java批量更新比Oracle的多值插入(所谓的“批量更新”)快得多。

    我的建议是:

  • 使用ADO.NET批插入比较SQL Server代码的多值插入(然后您可以从数据库中读取数据,如果愿意,可以使用过程)的性能。
  • 如果您要操作的数据来自应用程序之外(如果它尚未存在于数据库中),那么我会说只要使用ADO.NET批处理插入。 我认为你的情况。

    注意:请记住,批量插入通常使用相同的查询操作。 这就是让他们如此之快的原因。


    在循环中调用一个prc会导致许多往返SQL。

    不确定您使用了哪种批处理方式,但您应该查看表值参数:文档位于此处。 你会想要批量写入。

    您还需要考虑服务器上的内存。 批处理(一次说10K)可能会慢一点,但可能会使服务器的内存压力更低,因为您一次只能缓冲和处理一组数据。

    表值参数提供了一种简单的方法,可以将多行数据从客户端应用程序编组到SQL Server,而无需多次往返或用于处理数据的特殊服务器端逻辑。 您可以使用表值参数将数据行封装在客户端应用程序中,并通过单个参数化命令将数据发送到服务器。 传入的数据行存储在表变量中,然后可以使用Transact-SQL对其进行操作。

    另一种选择是批量插入。 TVP受益于重用,但取决于您的使用模式。 第一个链接有一个关于比较的说明:

    使用表值参数与使用基于集合的变量的其他方式相当; 然而,对于大型数据集,频繁使用表值参数会更快。 与具有比表值参数相比启动成本更高的批量操作相比,表值参数在插入少于1000行时表现良好。

    临时表缓存有利于重用表值参数。 此表缓存比同等的BULK INSERT操作具有更好的可扩展性。

    此处的另一个比较:bcp / BULK INSERT与表值参数的性能比较


    这里是我之前用SqlBulkCopy使用过的一个例子。 授予它我只处理大约10,000条记录,但它在查询运行后几秒钟插入了它们。 我的字段名称相同,因此非常简单。 您可能必须修改DataTable字段名称。 希望这可以帮助。

    private void UpdateMemberRecords(Int32 memberId)
        {
    
        string sql = string.Format("select * from Member where mem_id > {0}", memberId);
        try {
            DataTable dt = new DataTable();
            using (SqlDataAdapter da = new SqlDataAdapter(new SqlCommand(sql, _sourceDb))) {
                da.Fill(dt);
            }
    
            Console.WriteLine("Member Count: {0}", dt.Rows.Count);
    
            using (SqlBulkCopy sqlBulk = new SqlBulkCopy(ConfigurationManager.AppSettings("DestDb"), SqlBulkCopyOptions.KeepIdentity)) {
                sqlBulk.BulkCopyTimeout = 600;
                sqlBulk.DestinationTableName = "Member";
                sqlBulk.WriteToServer(dt);
            }
        } catch (Exception ex) {
            throw;
        }
    }
    
    链接地址: http://www.djcxy.com/p/94507.html

    上一篇: Fastest way to insert 1 million rows in SQL Server

    下一篇: Insert Multiple Rows Into Temp Table With SQL Server 2012