(http://msdn.microsoft.com/en-us/library/ms190273.aspx)
在一张有数百万行的大表上,这可能需要一些时间。难道只能停机处理吗?如何最好地处理这种情况?(http://msdn.microsoft.com/en-us/library/ms190273.aspx)
在一张有数百万行的大表上,这可能需要一些时间。难道只能停机处理吗?如何最好地处理这种情况?update table1 set column1 = column1
。我猜它以一种非常愚蠢的方式进行非空验证。这个事务的大小是表的两倍(前后页),所以对于一个DW表来说可能非常庞大。以前我们不得不将数据bcp导出,截断表,进行从null到非null的更改,然后再bcp导入。 - user7116我有一个特殊的异常,我觉得应该提一下。
使用SQL Server 2012 Enterprise及更高版本,在表中添加一个新的NOT NULL列,并且该列具有运行时常量,这是一个在线操作,可以立即完成,而且不受表中行数的影响。
关于此的更多信息可在MSDN中找到。
我将重现重要部分:
从SQL Server 2012 (11.x) Enterprise Edition开始,当默认值为运行时常量时,添加一个带有默认值的NOT NULL列是一个在线操作。这意味着无论表中有多少行,该操作几乎瞬间完成。因为在操作期间不会更新表中的现有行。相反,该默认值仅存储在表的元数据中,并且在访问这些行的查询中根据需要进行查找。