2

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

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

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

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

  • 使用 C# 4.0 的新 Parallel 特性允许一次处理多个文件,仍然通过一行一行地传递到存储过程
  • 创建一个新的临时数据库表,可以一次将文件中的所有行插入其中,然后对临时表中新添加的行调用存储过程。
  • 将流程拆分为 2 个任务。一项工作是将文件中的数据读取到临时数据库表中,另一项工作是处理临时表中的行。

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

4

4 回答 4

3

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

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

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

于 2011-04-03T20:55:02.957 回答
1

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

可以在此处找到有关 BCP 实用程序的更多信息:使用 bcp 实用程序导入和导出批量数据

您还可以看看:关于批量导入和批量导出操作

于 2011-04-03T21:00:15.073 回答
1

假设要导入的所有 3000 个文件每个都有 2000 行。那是每天 600 万行。瓶颈可能不在执行插入的客户端,而在于数据库本身。如果在相关表上启用了索引,则插入可能会很慢,具体取决于表的索引程度。哪些迹象使您得出这样的结论,即是数据库在等待某事做,而导入例程落后,而不是相反?

于 2011-04-03T22:52:32.727 回答
0

你说

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

(强调补充。)

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

修复它。

  • 预处理文件,以便它们可以被批量加载。
  • 预处理文件,使它们形成有效的 SQL INSERT 语句,并以这种方式加载它们。(在单个事务中。)

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

于 2011-04-04T01:11:02.880 回答