如何最有效地在 SQL Server 中插入/更新几百万行?

Posted

技术标签:

【中文标题】如何最有效地在 SQL Server 中插入/更新几百万行?【英文标题】:How to most efficiently insert/update a few million rows in SQL Server? 【发布时间】:2014-12-02 15:38:44 【问题描述】:

我有一个程序正在读取文本文件以更新/插入行。我在下面尝试了以下伪代码方法。这些都非常缓慢。我直接在 SQL Server 本身上运行这段代码,这些过程都需要很多小时才能完成......

更新/插入语句的数量以百万计。在 .net c# 中运行这么多 SQL 语句的最有效方法是什么?

// Insert/Update while reading text file
While (reader.read)

   sql.ExecuteNonQuery();

或者……

// build a list to loop through later and insert/update
While (reader.read)

   List.Add(sql);


foreach(string s in sql)

   sql.ExecuteNonQuery();

或者……

// Build a list and run 1000 statements at one time
While (reader.read)

   List.Add(sql);
   if(List.Count == 1000)
   
      sql.ExecuteNonQuery();
   

【问题讨论】:

如果批量插入不是一个选项,那么您可以创建临时表并通过 XML 进行所有批量插入,这也非常简单、快速和高效 【参考方案1】:

使用SqlBulkCopy Class。

让您可以高效地批量加载 SQL Server 表,其中包含来自 另一个来源。

Microsoft SQL Server 包含一个流行的命令提示实用程序,名为 bcp 用于将数据从一个表移动到另一个表,无论是在单个表上 服务器或服务器之间。 SqlBulkCopy 类让您编写 提供类似功能的托管代码解决方案。

有 将数据加载到 SQL Server 表中的其他方法(INSERT 语句, 例如),但 SqlBulkCopy 提供了显着的性能 优于它们。 SqlBulkCopy 类可用于写入数据 仅适用于 SQL Server 表。但是,数据源不受限制 到 SQL 服务器;任何数据源都可以使用,只要数据可以 加载到 DataTable 实例或使用 IDataReader 实例读取。

【讨论】:

@shaolinmonk,你不能用它来更新,据我所知,你必须在临时表中插入数据然后更新。请参阅:***.com/questions/4889123/… 和 ***.com/questions/12521692/…

以上是关于如何最有效地在 SQL Server 中插入/更新几百万行?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server - 当 WHERE 原因是唯一 ID 时进行多次更新的最有效方法

如何在 SQL Server 2005 中进行更新插入(更新或插入)

SQL Server插入触发器改进

如何在 SQL Server 触发器中复制插入、更新、删除的行

如何在SQL Server 2005中进行upsert(更新或插入)

如何通过 SQL Server 插入的索引有效地替换长字符串?