1

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

然后处理此数据:

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

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

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

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

4

3 回答 3

1

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

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

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

于 2008-09-16T10:34:20.777 回答
1

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

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

至于测试您的存储过程,我会诚实地研究DBFit。您的数据库不必再成为未经测试的功能的黑洞:)

于 2008-09-16T10:56:04.420 回答
0

你在哪里处理数据很大程度上取决于你在做什么。例如,如果您需要丢弃数据库中不需要的数据,则可以在 C# 代码中处理这些数据。但是,要在数据库中处理的数据通常应该是“与实施无关”的数据。因此,如果其他人想从 Java 客户端插入数据,数据库应该能够拒绝不良数据。如果您将该逻辑放入您的 C# 代码中,Java 代码将不会知道它。

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

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

于 2008-09-16T12:24:16.707 回答