【发布时间】: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