【问题标题】:Recommended way of querying multiple Versioned tables查询多个版本化表的推荐方式
【发布时间】:2010-12-15 02:06:03
【问题描述】:

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

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

版本表工作原理的简化示例:

销售订单

订单ID、金额 1, 100 2, 200

SalesOrderVersion

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 中的 a 行发生更改时,SalesOrderVersion 中的当前行 VersionEndDate 都会更新,并将新行插入到 SalesOrderVerion 中,VersionEndDate 为 99991231

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

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

有什么想法或建议吗?

【问题讨论】:

    标签: sql-server tsql snapshot


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-02
      • 2011-08-02
      • 1970-01-01
      相关资源
      最近更新 更多