【发布时间】:2011-09-26 19:24:58
【问题描述】:
我有一个位于视图顶部的报告。视图基础表每 15 分钟更新一次,更新周期大约需要 1 -2 分钟,在此期间,如果我运行我的报告,我的报告中会出现错误的值。有没有办法可以应用某种锁在视图上,以便我可以在更新完成后获取报告并避免我的报告中出现脏数据。如果有任何其他解决方案可以解决此问题,请告诉我
谢谢, 拉维
【问题讨论】:
标签: sql-server-2005
我有一个位于视图顶部的报告。视图基础表每 15 分钟更新一次,更新周期大约需要 1 -2 分钟,在此期间,如果我运行我的报告,我的报告中会出现错误的值。有没有办法可以应用某种锁在视图上,以便我可以在更新完成后获取报告并避免我的报告中出现脏数据。如果有任何其他解决方案可以解决此问题,请告诉我
谢谢, 拉维
【问题讨论】:
标签: sql-server-2005
我会考虑使用不同的方法来更新基础表。不要在 1-2 分钟内更新这些表,而是在另一个模式中创建“影子”表。 (并且有第三种模式用于临时保存。)这允许您处理用户看不到的表,然后使用简单的元数据操作将它们切换。然后你可以这样做:
此解决方案的一个缺点是您需要维护两组统计信息、索引等。对于统计数据,如果数据只是在增加而没有发生实质性变化,则应该没问题。
亚当·海恩斯 (Adam Haines) 在这里对这种方法(几年前我向他展示过)进行了非常详尽的描述:
http://jahaines.blogspot.com/2009/10/locking-table-while-it-is-being-loaded.html
【讨论】:
与 Aaron Bertrand 的回答类似,但使用同义词:
在这种情况下,您有 2 个同义词:一个是“要加载的表”,一个是“要查询的表”
可以将各种 CREATE 语句包装在具有EXECUTE AS OWNER 的存储过程中以升级权限。
根据您对 Aaron 回答的评论,您必须有一些切换方式。增加并发性的唯一方法是使用多个表。
【讨论】:
您是否考虑过以可重复读取或序列化隔离模式检索报表数据?
【讨论】: