将非空列添加到大型表SQL Server 2012在不同服务器上的行为有所不同

时间:2014-03-13 12:05:40

标签: sql-server sql-server-2012 database-performance alter-table

在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"版本在两者上都是即时的,它只是我看到差异的非空案例。

是否有可能影响此功能的配置选项?关于如何追踪差异的任何其他建议?

解决方案(如果有人在下面的评论中没有发现它)

我很困惑因为我在本地拥有开发人员版本,其行为类似于企业版。生产服务器没有企业版。

2 个答案:

答案 0 :(得分:1)

ALTER TABLE TableWithManyRows
    ADD TestNull INT NULL;

对表的记录没有任何意义

ALTER TABLE TableWithManyRows
    ADD TestWithValues INT NOT NULL DEFAULT 0 WITH VALUES;

将该列的每条记录更新为值0.对于大量数据,这将花费时间。

如果这是您的业务规则,那么您可以做很多事情。

答案 1 :(得分:0)

有很多事情可能导致这种情况。执行此操作需要锁定表以进行更新。它还必须更新现有数据的每一行。如果您有许多行数据(因为生产数据库通常具有多于您的开发副本),则需要更长的时间。此外,如果服务器处于高负载且许多人正在使用数据库和表,这也会导致性能下降,同时系统等待对表和/或数据行进行独占锁定以更新架构和设置每个现有行中的值。