将文件内容导入数据库的最快最好的方法

时间:2011-04-03 20:46:41

标签: c# sql performance import file-processing

我有文件夹,每天大约有3000个新的csv文件进入,每个文件包含50到2000行信息​​。

目前,有一个流程可以一次一个地挑选这些文件,每次一行,然后将其发送到存储过程以将内容插入数据库。

这意味着在一天的过程中,在下一个3000进入之前,它很难通过3000个文件!

我正在寻求改进这个过程并提出以下想法

  • 使用C#4.0的新并行功能允许一次处理多个文件,仍然逐行传递到存储过程
  • 创建一个新的临时数据库表,可以立即插入文件中的所有行,然后在临时表中新添加的行上调用存储过程。
  • 将流程拆分为2个任务。一项工作是将文件中的数据读入临时数据库表,另一项是处理临时表中的行。

关于我如何看待这样做的任何其他想法?目前每个文件最多需要20秒,我真的很想提高性能。

4 个答案:

答案 0 :(得分:3)

SQL Server批量插入可能正是您所需要的

http://msdn.microsoft.com/en-us/library/ms188365.aspx

您可能会看到所有这些插入需要很长时间的另一个问题是每次添加一行时,您的表可能会重新编制索引。像这样的搜索会提供很多关于如何通过当前程序获得更好性能的好文章 http://www.google.com/search?q=sql+insert+performance

答案 1 :(得分:1)

您可以使用SQL Server本机BCP实用程序。

有关BCP实用程序的更多信息,请访问:Importing and Exporting Bulk Data by Using the bcp Utility

您还可以查看:About Bulk Import and Bulk Export Operations

答案 2 :(得分:1)

假设要导入的所有3000个文件各有2000行。这是每天600万行。瓶颈可能不在客户端进行插入,而是在数据库本身。如果在所讨论的表上启用了索引,则插入可能会很慢,具体取决于表的索引程度。有什么迹象表明你得出的结论是,数据库正在等待一些事情要做,而且这是一个滞后的导入程序,而不是相反?

答案 3 :(得分:0)

你说

  

目前,已有一个流程   它会在一个文件中选择这些文件   时间并一次每行   并将其发送到存储过程   将内容插入数据库。

(强调补充。)

这似乎意味着一行等于一笔交易

修复此问题。

  • 预处理文件以便它们 批量装载可以接受。
  • 预处理文件以便形成 有效的SQL INSERT语句和加载 他们那样。 (在一次交易中。)

我猜这些听起来都像是“替换你的存储过程”。但真正的重点是减少交易数量。这些选项中的任何一个都会将此过程的交易数量从每天600万(最差情况)减少到每天3000个。