刷新准备好的报告表大约需要 5-10 分钟。我们希望不断刷新这个表(可能每 15 分钟一次或连续刷新一次)。
我们非常频繁地查询这个报告表(每分钟很多次),我无法长时间保持它。如果数据是 15 分钟前的,那没关系。
我不能删除表并重新创建它。我无法删除表的内容并重新创建它。
有没有我应该使用的技术,比如在两个表之间交换(在我们构建另一个表时从一个表中读取)或者我是否将这个 5-10 分钟的过程放在一个大事务中?
刷新准备好的报告表大约需要 5-10 分钟。我们希望不断刷新这个表(可能每 15 分钟一次或连续刷新一次)。
我们非常频繁地查询这个报告表(每分钟很多次),我无法长时间保持它。如果数据是 15 分钟前的,那没关系。
我不能删除表并重新创建它。我无法删除表的内容并重新创建它。
有没有我应该使用的技术,比如在两个表之间交换(在我们构建另一个表时从一个表中读取)或者我是否将这个 5-10 分钟的过程放在一个大事务中?
使用同义词?. 在创建时,它指向 tableA。
CREATE SYNONYM ReportingTable FOR dbo.tableA;
15 分钟后创建 tableB 并重新定义同义词
DROP SYNONYM ReportingTable;
CREATE SYNONYM ReportingTable FOR dbo.tableB;
同义词只是指向实际表的指针:这种方式对实际表重命名等的处理进行了简化和抽象,所有代码/客户端都将使用ReportingTable
编辑,2011 年 11 月 24 日
所有版本都提供同义词:分区切换仅适用于 Enterprise/Developer。
编辑,2012 年 2 月
您可以在标准版中切换整个表格(也许是 Express,未经测试)
ALTER TABLE .. SWITCH ..
如果目标表为空,这将比同义词更优雅。
编辑,2012 年 2 月 (2)
此外,您可以根据SQL Server 中的缓存联接表通过模式进行轮换
是的,您应该交换表,如果尚未完成,请考虑为报告表使用不同的服务器或其他物理分区。
近实时报告的推荐方法是从操作系统中卸载读取,并将报告系统中的写入活动与读取活动分开。
通过准备一个表格,您至少在逻辑上已经完成了第一部分。在用于用户的只读表和用于更新的单独表之间进行交换消除了事务之间的读写冲突。代价是用户的缓存延迟,但如果需要,应该可以采取措施尽量减少准备时间并更频繁地交换表。
有关实时报告中的设计选择的更多信息,我推荐 Wayne Eckerson 撰写的一篇写得很好的论文,运营 BI 的最佳实践。
在我们的项目中,我们使用了两个表,并使用 Create/Alter View 进行切换。
拥有两张桌子听起来像是最简单的解决方案。