存储过程Vs .net应用程序中的复杂处理

时间:2009-02-11 07:12:22

标签: database performance stored-procedures star-schema

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

在数据库中提供所有数据之后,系统必须进行大量计算。计算逻辑非常复杂。计算所需的所有数据都在数据库中,输出也需要存储在数据库中。数据收集将每周进行,计算需要每周进行,以生成所需的报告。

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

例如,我需要查询一个表,它将返回2000行,然后为每行我需要查询另一个表,这将返回300个结果,而不是每行我需要查询多个表(大约10个)要获取所需数据,请执行计算并将输出存储在另一个表中。

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


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

5 个答案:

答案 0 :(得分:4)

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

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

你说:

  

我需要查询一个表格   然后为每行返回2000行   我需要查询另一个表   将返回300我的结果比   这个我需要查询的每一行   获得多个表(大约10个)   所需数据

从您的问题看起来您似乎没有使用联接,并且您已经在考虑循环。即使你打算循环,最好还是编写一个查询来连接所有必要的数据,然后循环遍历它。记住更新和插入语句可能会有大量复杂的查询驱动它们。包含在CASE语句,派生表,条件连接(LEFT OUTER JOIN)中,您可以解决单个更新/插入中的任何问题。

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

每次存储过程,但正如KM在这些存储过程中所说的那样,将这些迭代保持在最小值,即在SQL中使用连接,关系数据库非常适合加入。

数据库可伸缩性将是一个小问题,特别是因为它听起来像是在批处理过程中执行这些计算。

除了最简单的CRUD应用程序之外,实际上并不存在数据库独立性,因此如果您的初始要求是将所有这些都与SQL Server一起使用,那么请利用RDBMS提供的工具(毕竟您的客户端将花费很多时间)交易金钱)。如果(并且它是一个很大的if)后续客户端真的不想使用SQL Server,那么你将不得不咬紧牙关并在另一种存储过程中编写代码。但是当你确定:“如果我一直在查询数据库的.net中完成所有这些,我认为它不会很快完成工作。”你已经将这样做的费用推迟到需要的时候。

答案 4 :(得分:0)

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