代码之家  ›  专栏  ›  技术社区  ›  Stuart Moore

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

  •  0
  • Stuart Moore  · 技术社区  · 11 年前

    在SQL Server 2008/2012中,向大型表中添加空列(默认为空)几乎是即时的。

    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。运行“空”版本对这两种情况都是即时的,这只是我看到的不同之处的非空情况。

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

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

    我很困惑,因为我在本地有开发者版,它的行为类似于企业版。生产服务器没有企业版。

    2 回复  |  直到 11 年前
        1
  •  1
  •   jenson-button-event    11 年前
    ALTER TABLE TableWithManyRows
        ADD TestNull INT NULL;
    

    对表的记录没有任何影响

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

    将该列的每个记录更新为值0。对于大量数据,这需要时间。

    如果这是你的商业规则,你可以做的不多。

        2
  •  0
  •   BBlake    11 年前

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