Bhu*_*ale 4 database performance stored-procedures star-schema
我们正在使用 SQL Server 数据库在 .net 3.5 中构建一个新应用程序。该数据库相当大,有大约 60 个带有数据负载的表。.net 应用程序具有将数据从数据输入和第三方系统引入此数据库的功能。
当数据库中的所有数据可用后,系统必须进行大量计算。计算逻辑相当复杂。计算所需的所有数据都在数据库中,输出也需要存储在数据库中。数据收集每周都会进行,并且需要每周进行计算以生成所需的报告。
由于上述情况,我想使用存储过程进行所有这些计算。问题是我们还需要数据独立性,而存储过程无法为我们提供这一点。但如果我一直在.net中通过查询数据库来完成所有这些工作,我认为它无法快速完成工作。
例如,我需要查询一个表,该表将返回 2000 行,然后对于每一行,我需要查询另一个表,该表将返回 300 个结果,而对于该表的每一行,我需要查询多个表(大约 10 个)才能获得所需的结果数据,进行计算并将输出存储在另一个表中。
现在我的问题是我应该继续使用存储过程解决方案并忘记数据库独立性,因为性能很重要。我还认为如果我们使用存储过程解决方案,开发时间会少得多。如果任何客户希望在 Oracle 数据库上使用此解决方案(因为他们不想维护另一个数据库),那么我们将存储过程移植到 Oracle 数据库并维护两个版本以供将来的更改/增强。同样,其他客户可能会要求其他数据库。
我上面提到的 2000 行是产品 sku。我提到的 300 行具有我们要计算的不同属性,例如处理成本、运输成本等。我提到的 10 个表包含有关货币换算、单位换算、网络、区域、公司、销售价格、每售出数量的信息天等。生成的表将所有信息存储为星型模式,以用于分析和报告目的。目标是获得有关产品的任何详细信息,以便人们知道产品销售的哪些属性导致我们花钱以及我们可以在哪里进行改进。
我不会考虑在数据库以外的任何地方进行数据操作。
大多数人尝试使用循环算法来处理数据库数据。如果您需要真正的速度,请将您的数据视为一组行,并且您可以在一次更新中更新数千行。我将新手程序员编写的许多游标循环重写为单个更新语句,其中执行时间得到了极大的改善。
你说:
我需要查询一个表,该表将返回 2000 行,然后对于每一行,我需要查询另一个表,该表将返回 300 个结果,而对于该表的每一行,我需要查询多个表(大约 10 个)来获取所需的数据
从你的问题来看,你似乎没有使用连接,并且你已经在循环思考。即使您确实打算循环,最好编写一个查询来加入所有必要的数据,然后对其进行循环。请记住,更新和插入语句可能有非常复杂的查询来驱动它们。包含在 CASE 语句、派生表、条件联接 (LEFT OUTER JOIN) 中,您几乎可以在一次更新/插入中解决任何问题。