查询多个Versioned表的推荐方法

时间:2009-11-10 15:14:44

标签: sql-server tsql snapshot

在其上运行带有MSSQL 2005的win 2003框。每天早上都有一个数据库填充,前一天新的/修改过的SalesOrder。该数据库有几个表:SalesOrder,SalesOrderItem,SalesOrderItemBom。每个都有一个相应的Version表(即SalesOrderVersion,SalesOrderItemVersion,SalesOrderItemBomVersion),它具有完全相同的字段,但有2个加法列VersionStartDate,VersionEndDate。非Versioned表具有最新数据。

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

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

SalesOrder

OrderID,金额 1,100 2,200

SalesOrderVersion

VersionStartDate,OrderID,VersionEndDate,Amount 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,9,99991231 00:00:00,200

每当SalesOrder中的一行更改时,SalesOrderVersion中的当前行VersionEndDate都会更新,并且使用VersionEndDate 99991231将新行插入SalesOrderVerion

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

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

有任何想法或建议吗?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

另一方面,在加载一天数据后添加一个例程来生成当天的报告,并且只保留一组数据(或者过去一周,四周,无论如何)的一组数据。强烈的吸引力如果你知道他们将要运行那个5分钟的报告,请在AM中启动,以便在他们进入时准备就绪。

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