将DataTable导入SQL Server最快的方法是什么?

9

我有一个DataTable存储在内存中,需要直接将其转储到SQL Server临时表中。

在数据被插入后,我会对其进行一些转换,然后将其中的一部分记录插入永久表中。

这个操作最耗时的部分是将数据导入临时表中。

现在,我必须使用临时表,因为此应用程序的多个副本正在同时运行,并且在实际插入永久表之前,我需要一个隔离层。

从C# DataTable批量插入SQL临时表的最快方法是什么?

由于我正在对内存中的数据进行转换,因此不能使用任何第三方工具。

我的当前方法是创建一个参数化的SqlCommand:

INSERT INTO #table (col1, col2, ... col200) VALUES (@col1, @col2, ... @col200)

然后,对于每一行,清除并设置参数,然后执行。

必须有一种更有效率的方法。我能够在几秒钟内读写磁盘上的记录...


数据集中有多少行?插入需要多长时间? - shahkalpesh
200000行,超过45分钟。 - John Gietzen
2个回答

10

SqlBulkCopy可以以非常快的速度获取数据。

我之前在博客中介绍了如何最大化性能。这里还有一些统计数据和示例。我比较了两种技术,一种是使用 SqlDataAdapter,另一种是使用 SqlBulkCopy——底线是对于插入 100K 条记录,数据适配器方法需要约 25 秒,而 SqlBulkCopy 只需约 0.8 秒。


+1,但我会把采纳给SLaks,因为他更快一点。感谢提供链接。 - John Gietzen
他快速而准确,就像狙击步枪的子弹。 - James Westgate

9

很棒,但是你知道它是否可以用于临时表吗? - John Gietzen
@John Gietzen - 我通常的做法是加载到一个“真实”的表中,然后在完成后将其删除。 - AdaTheDev
嗯,这有点可行,但是可能会有大约10个副本的应用程序同时运行。您知道批量复制是否可以成为事务的一部分吗? - John Gietzen
1
@John Gietzen - 如果它们都应该彼此分开,那么加载到“临时”实际表中-只需在运行时生成唯一的表名以防止它们竞争。您可以将批量复制作为事务的一部分(http://msdn.microsoft.com/en-us/library/wftd1yfz(v=VS.100).aspx),但我个人从未这样做过。 - AdaTheDev
好消息!您可以使用外部事务,并且可以使用临时表!从20分钟缩短到8秒! - John Gietzen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接