sql-server – 如何在最小停机时间的情况下将rowversion列添加到大型表中

前端之家收集整理的这篇文章主要介绍了sql-server – 如何在最小停机时间的情况下将rowversion列添加到大型表中前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
使用sql Server 2008及更高版本,我想在一个大表中添加一个rowversion列,但是当我简单的时候
ALTER TABLE [Tablename]
ADD Rowversion [Rowversion] NOT NULL

然后该表不能用于更新太长时间.

我可以使用哪些策略来减少停机时间?我会考虑任何事情.当然越简单越好,但我会考虑任何策略.

我的想法是,作为最后的手段,我可​​以维护一个由触发器维护的复制临时表,然后将登台表sp_rename到原始表中.但我希望有更简单/更容易的事情.

解决方法

考虑使用相同的模式和rowversion列创建一个新表,并在两个表上添加一个视图,该视图执行union all.让人们使用视图,并针对基础表格编写替代触发器.观点.

插入应该发送到新表,更新应该将数据移动到新表,删除应该应用于两个表.

然后在后台进行批量移动,一次移动尽可能多的记录到新表.在这种情况下,您仍然可以遇到并发问题,以及一些精彩的执行计划,但它可以让您在移动发生时保持在线状态.

理想情况下,您在星期五下午开始这个过程,以尽量减少对最终用户的影响,并尝试在星期一早上之前完成.一旦它到位,您可以将视图更改为仅指向新表,并且精简的执行计划将消失.理想的情况下.

要避免在批量迁移数据时触发触发器,请查看触发器中已删除/插入的表中的行数,如果它们接近批处理中的行数,则跳过活动.

在结束时,迈克尔决定跳过视图(而不是从原始表中删除)以获得更稳定的计划.权衡基本上是两份表.他把它变成了series of blog posts.

猜你在找的MsSQL相关文章