如何最有效地在 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 触发器中复制插入、更新、删除的行