SQL Server 2012需要很长时间才能在简单的alter上添加NULL列

时间:2016-08-26 03:52:13

标签: sql sql-server tsql sql-server-2012 alter-table

我在SQL Server 2012中更改表时遇到问题,需要很长时间才能将允许NULL的04列添加到包含340列和大约166M行和01非聚集索引的大表

此问题仅在恢复后的特定表中发生。 我正在等待执行10个小时,但还没有完成,所以我必须取消它以进行更多调查。这很奇怪,因为脚本真的非常简单,如下所示:我们之前已成功完成:

alter table sample_database.sample_schema.sample_table
add column_001 int null
   ,column_002 numeric(18,4) null
   ,column_003 nvarchar(500) null
   ,column_004 int null;

我的问题是:

  • 为什么会发生奇怪的事?
  • 如何解决这个问题,因为它与我们的部署包有关?我们已经完成了使用新列和加载数据创建新表的解决方法。但它对我们不起作用。
  • 将来如何预防此问题?

非常感谢所有人,

3 个答案:

答案 0 :(得分:2)

如果是2012年(根据标签),可能会发生这种情况:

http://rusanu.com/2012/02/16/adding-a-nullable-column-can-update-the-entire-table/

  

如果在SQL Server 2012中添加可为空的列具有潜在的可能性   增加行大小超过8060大小然后ALTER执行   离线数据大小更新到表的每一行以确保它   适合页面。此行为是SQL Server 2012中的新增功能。

答案 1 :(得分:0)

@Anton解释了这背后的原因。 -Page Split

对于解决方法,您可以按照以下步骤操作:

  1. 使用空行创建克隆表(例如SELECT * INTO <New table> from sample_table WHERE 0=1
  2. 在。
  3. 中添加新列
  4. 将数据从sample_table复制到。
  5. 完成第3步后,修改sample_table名称并重命名为sample_table。
  6. 您还应尝试添加NOT NULL值的列,并在添加列后再对其进行相应修改。

答案 2 :(得分:0)

这种情况发生在我们的UAT环境中。从最新备份再次还原数据库后,此问题不会再次发生。修改在mili-seconds内完成。

在我看来,自上次恢复以来存在一定的问题。

非常感谢所有人,