1

有一个运行 MSSQL 2005 的 win 2003 机器。每天早上都有一个数据库,其中包含前一天创建的新/修改的 SalesOrder。该数据库有几个表:SalesOrder、SalesOrderItem、SalesOrderItemBom。每个都有一个对应的版本表(即 SalesOrderVersion、SalesOrderItemVersion、SalesOrderItemBomVersion),该表具有完全相同的字段,但有 2 个附加列 VersionStartDate、VersionEndDate。非版本化表具有最新数据。

VersionStartDate 也是版本表的 PK 的一部分,例如:- SalesOrder 将 OrderID 作为 PK,SalesOrderItem 将 VersionStartDate、OrderID 作为 PK。

版本表如何工作的简化示例:

销售订单

OrderID, 金额 1, 100 2, 200

销售订单版本

VersionStartDate, OrderID, VersionEndDate, 金额 20090101 13:00:00, 1, 20090103 08:00:00, 50 20090103 08:00:00, 1, 99991231 00:00:00, 100 20090101 09:00:00, 2, 20090105 15:00:00, 300 20090105 15:00:00, 2, 99991231 00:00:00, 200

每当更改 SalesOrder 中的行时,SalesOrderVersion 中的当前行 VersionEndDate 都会更新,并将新行插入到 SalesOrderVerion 中,VersionEndDate 为 99991231

注意:如果 SalesOrderItem 中的记录发生更改,不一定会导致 SalesOrder 中的“父”记录发生更改

已被要求制作一份显示销售趋势和每日增量的报告。在我的脑海中,我正在考虑为 SalesOrder、SalesOrderItem、SalesOrderItemBom 创建 3 个快照表,它们捕获当天的“最新数据”,从而构建增量快照以显示趋势。除了需要更多磁盘空间之外,与执行连接版本表的存储过程相比,此方法是否有任何缺点,因为它似乎是一个漫长而昂贵的查询。

有什么想法或建议吗?

4

1 回答 1

1

这里有很多“取决于”。以下是一些讨论思路。

数据是否只在早上加载?这意味着数据在一天中不会发生变化,因此长时间昂贵的查询不会导致锁定或阻塞问题。该数据库仅用于报告吗?如果不是 - 如果数据全天更新 - 可能需要额外的数据冗余副本来支持您的要求。

新报告的运行频率如何?它们会在一天内运行很多次,还是只运行一次或两次?如果要一遍又一遍地访问“时间聚合”数据,制作冗余副本(快照)可能是值得的,但如果报告要运行一次或两次然后转储,我不知道我会打扰的。

性能有多重要?必须在 phb 按下按钮后的两三秒内生成并完成报告吗?(停顿)不,真的,特别是当你向他们解释了以美元计的成本(额外的硬盘空间、额外的备份空间、额外的准备、备份和恢复时间,以及任何其他因数据膨胀而产生的隐形成本)。如果他们可以等待几分钟来获得每天一次的报告,那就让它更便宜。(你仍然有编写更复杂代码的前期成本,但一旦完成,它就完成了。

另一方面,在加载一天的数据后添加一个例程来生成当天的报告,并且只保留一组数据(或者可能是过去一周、四个星期等的一组数据)具有很强的吸引力。如果您知道他们将运行 5 分钟报告,请在上午启动它,以便在他们进来时准备好。

这些都是基于对您的操作要求的猜测。就像我说的,很大程度上取决于你拥有什么以及你需要什么。

于 2009-11-10T15:31:53.750 回答