使用 SQL Server 2008 及更高版本,我想将 rowversion 列添加到大表中,但是当我只是
ALTER TABLE [Tablename]
ADD Rowversion [Rowversion] NOT NULL
然后该表太长时间无法更新。
我可以使用哪些策略来减少停机时间?我会考虑任何事情。当然越简单越好,但我会考虑任何策略。
我的想法是,作为最后的手段,我可以维护一个由触发器维护的副本登台表,然后将登台表 sp_rename 重新命名为原始表。但我希望有一些更简单/更容易的东西。
考虑创建一个具有相同架构和 rowversion 列的新表,并在两个表的顶部添加一个视图,该视图将全部合并。让人们使用视图,并针对基础表和视图编写触发器而不是触发器。
插入应该发送到新表,更新应该将数据移动到新表,删除应该应用于两个表。
然后在后台进行批量移动,一次将尽可能多的记录移动到新表中。在此过程中,您仍然可能会遇到并发问题,以及一些杂乱无章的执行计划,但它可以让您在移动发生时保持在线。
理想情况下,您在周五下午开始该过程,以尽量减少对最终用户的影响,并尝试在周一早上之前完成。一旦它到位,您可以将视图更改为仅指向新表,然后杂乱无章的执行计划就消失了。理想情况下。
为避免在批量迁移数据时触发触发器,请查看触发器中已删除/插入的表中的行数,如果活动接近批处理中的行数,则跳过这些活动。
最后,Michael 决定跳过视图(而不是从原始表中删除)以获得更稳定的计划。权衡是基本上持有两张桌子。他把它变成了一系列博客文章。
如果你有时间提前计划,有一个更简单的解决方案......(通常)
长锁几乎肯定是由存储层的页面拆分引起的。所以强迫他们按照你自己的时间表。
VARBINARY(8)
。0x0000000027F95A5B
例如)我已经成功地使用它在 10 分钟内将 rowversion 列添加到 150M 行表中。
警告...如果您有一个包含大型 varchar 字段的表(尤其是
varchar(max)
),SQL Server 决定重建表而不是重新使用新的可用空间。仍在试图找出解决方法。如果
TIMESTAMP
您要添加的是NULLABLE
:VARBINARY(8)
列填充后,在背靠背 SQL 语句中,您刚刚添加并填充的列,并添加该
DROP
列。VARBINARY(8)
TIMESTAMP NULL
如果
TIMESTAMP
您要添加的是NOT NULLABLE
:BINARY(8)
列填充后,在背靠背 SQL 语句中,您刚刚添加并填充
DROP
的列和列。BINARY(8)
ADD THE TIMESTAMP NOT NULL