使用sql Server 2008及更高版本,我想在一个大表中添加一个rowversion列,但是当我简单的时候
ALTER TABLE [Tablename] ADD Rowversion [Rowversion] NOT NULL
然后该表不能用于更新太长时间.
我可以使用哪些策略来减少停机时间?我会考虑任何事情.当然越简单越好,但我会考虑任何策略.
我的想法是,作为最后的手段,我可以维护一个由触发器维护的复制临时表,然后将登台表sp_rename到原始表中.但我希望有更简单/更容易的事情.
解决方法
考虑使用相同的模式和rowversion列创建一个新表,并在两个表上添加一个视图,该视图执行union all.让人们使用视图,并针对基础表格编写替代触发器.观点.
插入应该发送到新表,更新应该将数据移动到新表,删除应该应用于两个表.
然后在后台进行批量移动,一次移动尽可能多的记录到新表.在这种情况下,您仍然可以遇到并发问题,以及一些精彩的执行计划,但它可以让您在移动发生时保持在线状态.
理想情况下,您在星期五下午开始这个过程,以尽量减少对最终用户的影响,并尝试在星期一早上之前完成.一旦它到位,您可以将视图更改为仅指向新表,并且精简的执行计划将消失.理想的情况下.
要避免在批量迁移数据时触发触发器,请查看触发器中已删除/插入的表中的行数,如果它们接近批处理中的行数,则跳过活动.
在结束时,迈克尔决定跳过视图(而不是从原始表中删除)以获得更稳定的计划.权衡基本上是两份表.他把它变成了series of blog posts.