我应该使用SqlBulkCopy或存储过程来导入数据

时间:2012-01-23 08:35:14

标签: sql-server-2005 c#-4.0 bulk-load

我有一个248 MB的日志文件,可以扩展到GB。所以你可以想象有多少行。我需要将所有行导入SQL Server数据库的表中。为此,我首先创建一个DataTable,并将日志文件中的所有行添加到该DataTable中作为新行。这发生得非常快。超过一百万条记录在大约30秒内被添加到表中。在表填充了行之后,然后使用存储过程将DataTable中的记录导入数据库。然而,这个阶段执行得很厉害。现在我想知道,如果我应该使用SqlBulkCopy WriteToServer方法,还是应该保持这种方式?如果SqlBulkCopy是一个更好的选择,那么我应该使用DataTable或IDataReader版本。提前谢谢。

1 个答案:

答案 0 :(得分:2)

我会使用SqlBulkCopy进行任何实际卷的数据导入。与SqlDataAdapter的性能差异可能很大。例如我blogged作为导入100K行的性能比较:

SqlBulkCopy:1.5885s
SqlDataAdapter:25.0729s

如果你使用带有SqlBulkCopy的TableLock选项,你可以获得更大的吞吐量,在我的测试中,导入然后降低到0.8229s。

值得注意的是,使用SqlBulkCopy,您可以让多个实例将一段数据并行批量加载到同一目标表中,而不会相互竞争。对另一个external link道歉,但我认为这是相关的。这是关于加载到堆表,没有索引,以获得最佳性能,这可能不是您当前场景的选项,但绝对值得了解。