4

我们正在使用 SQL Server 数据库在 .net 3.5 中构建一个新应用程序。该数据库相当大,大约有 60 个表,其中包含数据负载。.net 应用程序具有将数据从数据输入和第三方系统导入此数据库的功能。

数据库中的所有数据都可用后,系统必须进行大量计算。计算逻辑相当复杂。计算所需的所有数据都在数据库中,输出也需要存储在数据库中。每周都会进行数据收集,并且需要每周进行计算以生成所需的报告。

由于上述情况,我正在考虑使用存储过程进行所有这些计算。问题是我们还需要数据独立性,而存储过程将无法为我们提供。但是,如果我一直在.net 中通过查询数据库来完成所有这些工作,我认为它无法快速完成工作。

例如,我需要查询一个表,该表将返回 2000 行,然后对于每一行我需要查询另一个表,该表将返回 300 个结果,而不是每行我需要查询多个表(大约 10 个)以获得所需数据,进行计算并将输出存储在另一个表中。

现在我的问题是我应该继续使用存储过程解决方案并忘记数据库独立性,因为性能很重要。我也认为如果我们使用存储过程解决方案,开发时间会少很多。如果任何客户想要在 oracle 数据库上使用此解决方案(因为他们不想维护另一个数据库),那么我们将存储过程移植到 oracle 数据库并维护两个版本以供将来任何更改/增强。同样,其他客户可能会要求其他数据库。


我上面提到的 2000 行是产品 skus。我提到的 300 行是我们要计算的不同属性,例如处理成本、运输成本等。我提到的 10 个表包含有关货币换算、单位换算、网络、区域、公司、售价、每人售出数量的信息天等。生成的表将所有信息存储为星型模式,用于分析和报告目的。目标是获取有关产品的任何详细信息,以便了解产品销售的哪些属性正在花费我们的钱以及我们可以在哪里进行改进。

4

5 回答 5

4

我不会考虑在数据库以外的任何地方进行数据操作。

大多数人尝试使用循环算法处理数据库数据。如果您需要真正的速度,请将您的数据视为一组行,您可以在一次更新中更新数千行。我已经将新手程序员编写的许多游标循环重写为单个更新语句,从而大大提高了执行时间。

你说:

我需要查询一个表,该表将返回 2000 行,然后对于每一行,我需要查询另一个表,该表将返回 300 个结果,而不是每行我需要查询多个表(大约 10 个)以获取所需的数据

从您的问题来看,您似乎没有使用连接,并且您已经在循环思考。即使您确实打算循环,最好编写一个查询来加入所有必要的数据,然后循环它。记住 update 和 insert 语句可能有非常复杂的查询来驱动它们。包含在 CASE 语句、派生表、条件连接 (LEFT OUTER JOIN) 中,您几乎可以在单个更新/插入中解决任何问题。

于 2009-02-11T18:48:38.713 回答
3

好吧,没有任何关于您在这些表格中拥有哪些数据的具体细节,只是餐巾纸计算的背面显示您正在谈论在您提供的示例中处理超过 600 万行信息(2,000 行 * 300 行 *(1 行* 10 张桌子))。

所有这些行是不同的,还是 10 个表的查找信息具有相对较低的基数?换句话说,是否可以编写一个程序,将内存中的 10 个查找表中的信息,然后只处理内存中的 300 行结果集来执行计算?

另外,我会担心可伸缩性——如果您在存储过程中执行此操作,则可以保证它是一个受单个数据库服务器速度限制的串行过程。如果您有多个客户端程序副本的可能性,每个副本处理 2,000 个初始记录集的一部分,那么您可以并行执行一些计算,也许可以加快您的整体处理时间,并使其可扩展以适应何时您的初始记录集大 10 倍。

于 2009-02-11T07:19:30.400 回答
1

在 C# 中编程计算代码之类的东西往往更容易且更易于维护。此外,通常将 SQL Server 上的处理保持在最低限度是一种很好的做法,因为数据库是最难扩展的。

话虽如此,从您的描述看来,存储过程方法是可行的方法。当计算代码依赖于大量数据时,将数据移出服务器进行计算会更加昂贵。因此,除非您有优化相关数据的合理方法(例如缓存查找表?),否则您很可能会发现它更痛苦,那么不使用存储过程是值得的。

于 2009-02-11T07:39:14.487 回答
1

每次都存储过程,但正如 KM 在这些存储过程中所说,将这些迭代保持在最低限度,也就是说在 SQL 中使用连接,关系数据库非常擅长连接。

数据库可扩展性将是一个小问题,尤其是当您听起来像是在批处理中执行这些计算时。

除了最琐碎的 CRUD 应用程序之外,数据库独立性实际上并不存在,因此,如果您最初的要求是让这一切都与 SQL Server 一起工作,那么请利用 RDBMS 提供的工具(毕竟您的客户将花费大量金钱)在上面)。如果(这是一个很大的如果)后续客户端真的不想使用 SQL Server,那么您将不得不硬着头皮用另一种存储过程的方式对其进行编码。但是正如您所确定的:“如果我一直在 .net 中通过查询数据库执行所有这些操作,我认为它无法快速完成工作。” 您已经将这样做的费用推迟到需要时。

于 2010-02-16T01:56:51.460 回答
0

我会考虑在 SQL Server Integration Services (SSIS) 中执行此操作。我将计算放入 SSIS,但将查询保留为存储过程。这将为您提供数据库独立性 - SSIS 可以通过 ODBC 连接处理来自任何数据库的数据 - 以及高性能。只有简单的 SELECT 语句会在存储过程中,并且这些是 SQL 标准中最有可能在多个数据库产品中相同的部分(假设您坚持使用标准形式的查询)。

于 2010-02-16T02:12:56.520 回答