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 亿行表上重新添加索引和键,则创建新表、复制、重命名可能需要更长的时间。
我已经更改了十亿行表,这需要几秒钟才能添加一个可为空的列。
我说过要先备份吗?
Aar*_*and 21
如果该列可以为 NULL,则影响应该可以忽略不计。如果列不能为 NULL 并且必须设置值,那么它可能会大不相同。在这种情况下,我会做的是,不是一次性添加非空和默认约束,而是有效地向每一行添加数据:
同意@gbn,您可以通过恢复生产副本并在那里尝试来测试这一点……您会很好地了解时间(假设硬件有些相似),并且您还可以看到对事务日志的影响。
| 归档时间: |
|
| 查看次数: |
28397 次 |
| 最近记录: |