在SQL Server 2008/2012中,将空列添加到大型表(默认为null)或多或少是即时的。
ALTER TABLE TableWithManyRows
ADD TestNull INT NULL;
在SQL Server 2012中,将非空列设置为默认值也应如此 - 请参阅http://rusanu.com/2011/07/13/online-non-null-with-values-column-add-in-sql-server-11/
以下声明:
ALTER TABLE TableWithManyRows
ADD TestWithValues INT NOT NULL DEFAULT 0 WITH VALUES;
在我的本地计算机上或多或少地立即运行,但在生产数据库服务器上运行速度非常慢。
两者都在运行SQL Server 2012.运行" Null"版本在两者上都是即时的,它只是我看到差异的非空案例。
是否有可能影响此功能的配置选项?关于如何追踪差异的任何其他建议?
解决方案(如果有人在下面的评论中没有发现它)
我很困惑因为我在本地拥有开发人员版本,其行为类似于企业版。生产服务器没有企业版。
答案 0 :(得分:1)
ALTER TABLE TableWithManyRows
ADD TestNull INT NULL;
对表的记录没有任何意义
ALTER TABLE TableWithManyRows
ADD TestWithValues INT NOT NULL DEFAULT 0 WITH VALUES;
将该列的每条记录更新为值0.对于大量数据,这将花费时间。
如果这是您的业务规则,那么您可以做很多事情。
答案 1 :(得分:0)
有很多事情可能导致这种情况。执行此操作需要锁定表以进行更新。它还必须更新现有数据的每一行。如果您有许多行数据(因为生产数据库通常具有多于您的开发副本),则需要更长的时间。此外,如果服务器处于高负载且许多人正在使用数据库和表,这也会导致性能下降,同时系统等待对表和/或数据行进行独占锁定以更新架构和设置每个现有行中的值。