管理大量数据 - 存储过程或数据集或其他......?

时间:2008-09-16 10:28:44

标签: c# database

我有一个应用程序,每天导入大量数据,数十万条记录 数据来自不同的来源。使用C#读取数据,然后批量插入数据库。

然后处理该数据:

  • 链接了不同的表格
  • 生成新表
  • 使用复杂的算法校正数据(某些表的总数必须为零)

大部分处理都是在存储过程中完成的。
虽然C#中的一些复杂处理会更简单,但是将数据提取到数据集中并将其重新注入会大大减慢速度。
您可能会问为什么我在将数据插入数据库之前不处理数据,但我认为在内存中操作100,000个记录并不可行,并且基于SQL集的命令在创建大量记录时有帮助。

这可能会引发使用存储过程及其优缺点的古老问题。 (例如,如何对存储过程进行单元测试?)

我想回答的是您对大量数据的体验以及您如何解决问题。

3 个答案:

答案 0 :(得分:1)

我会使用SSIS或DTS(假设你在谈论MSSQL)。它们是为此目的而制作的,如果您需要它们可以与SP一起使用。

另一种选择是使用Perl预处理数据。即使这听起来像一个奇怪的建议,Perl在这些场景中实际上非常快。我过去曾用它在合理的时间内处理数十亿条记录(即数天而不是数周)。

关于“你如何单元测试商店程序”,你可以像MBUnit一样对它们进行单元测试。只有一点建议:数据的设置和回滚可能很棘手,您可以使用DTS事务或显式SQL语句。

答案 1 :(得分:1)

当谈到在MSSQL中做事时,我通常不得不同意Skliwz。 SSIS和DTS是可行的方法,但如果您不熟悉这些技术,则可能会很麻烦。但是,有一种替代方法可以让您在C#中进行处理,并且仍然可以将数据保存在SQL Server中。

如果您真的认为C#中的处理会更简单,那么您可能需要考虑使用SQL Server Project来创建database objects using C#。您可以使用SQL Server内部的CLR对象执行许多非常强大的功能,这样您就可以在代码接触数据库之前编写代码并对其进行单元测试。您可以使用任何标准单元测试框架(NUnit,MSTest)对VS内部的CLR代码进行单元测试,而且您不必编写一堆难以管理的设置和拆除脚本。

就测试存储过程而言,我会诚实地调查DBFit。您的数据库不再是未经测试的功能的黑洞:)

答案 2 :(得分:0)

处理数据的位置在很大程度上取决于您正在做的事情。例如,如果您需要丢弃数据库中不需要的数据,则可以在C#代码中处理该数据。但是,要在数据库中处理的数据通常应该是应该“实现不可知”的数据。因此,如果其他人想要从Java客户端插入数据,则数据库应该能够拒绝不良数据。如果将该逻辑放入C#代码中,Java代码就不会知道它。

有些人反对并说“但我永远不会在数据库中使用其他语言!”即使这是真的,你仍然会有DBA或开发人员使用数据库,如果逻辑不存在,他们会犯错误。或者你的新C#开发人员会尝试推送数据而不知道(或者只是忽略)用C#编写的数据预处理器。

简而言之,您放入数据库的逻辑应该足以保证数据的正确性,而不依赖于外部软件。

相关问题