将列添加到生产表

sh-*_*eta 30 sql-server sql-server-2008-r2 alter-table locking

将列添加到 SQL Server 2008 R2 上的大型生产表的最佳方法是什么?根据微软的在线书籍:

ALTER TABLE 中指定的更改会立即实施。如果更改需要修改表中的行,则 ALTER TABLE 更新行。ALTER TABLE 获取表上的模式修改锁,以确保在更改期间没有其他连接引用甚至表的元数据,除了在最后需要非常短的 SCH-M 锁的在线索引操作。

(http://msdn.microsoft.com/en-us/library/ms190273.aspx)

在包含数百万行的大表上,这可能需要一段时间。停电是唯一的选择吗?处理这种情况的最佳方法是什么?

gbn*_*gbn 27

“这取决于”

如果您添加一个不需要向行添加数据的列,那么它可以非常快。

例如,添加 int 或 char 需要物理行移动。添加一个没有默认值的可空 varchar 不应该(除非 NULL 位图需要扩展)

您需要在恢复的生产副本上进行尝试以获取估算值

如果您必须在 10 亿行表上重新添加索引和键,则创建新表、复制、重命名可能需要更长的时间。

我已经更改了十亿行表,这需要几秒钟才能添加一个可为空的列。

我说过要先备份吗?

  • 您的意思是“不需要”向第二行中的行添加数据吗? (5认同)
  • +1 备份。并确保您也有足够的日志空间。 (2认同)

Aar*_*and 21

如果该列可以为 NULL,则影响应该可以忽略不计。如果列不能为 NULL 并且必须设置值,那么它可能会大不相同。在这种情况下,我会做的是,不是一次性添加非空和默认约束,而是有效地向每一行添加数据:

  • 将该列添加为 NULLable - 在大多数情况下应该很快
  • 将值更新为默认值
    • 如有必要,您可以分批执行此操作
    • 您还可以使用它来应用条件逻辑,其中某些行可能无法获得默认值
  • 添加非空/默认约束
    • 当没有任何数据为 NULL 时,这会更快,但仍然应该是可测量的

同意@gbn,您可以通过恢复生产副本并在那里尝试来测试这一点……您会很好地了解时间(假设硬件有些相似),并且您还可以看到对事务日志的影响。