我需要向数据库中的表添加新列。该表包含约1.4亿行,我不确定如何在不锁定数据库的情况下进行操作。

数据库正在生产中,这就是为什么它必须尽可能平滑。

我已经读了很多书,但是无论这是否有风险,都没有得到答案。
新列可以为空,默认列可以为NULL。据我了解,如果新列需要默认值,则存在更大的问题。

对于这个问题,我将不胜感激。这可行吗?

最佳答案

是的,这是绝对可行的。

添加一个可以接受NULL且没有默认值的列,不需要长时间运行的锁定即可向表中添加数据。

如果提供默认值,则SQL Server必须更新每个记录,以便将该新列值写入行中。

总体上如何工作:

+---------------------+------------------------+-----------------------+
| Column is Nullable? | Default Value Supplied | Result                |
+---------------------+------------------------+-----------------------+
| Yes                 | No                     | Quick Add (caveat)    |
| Yes                 | Yes                    | Long running lock     |
| No                  | No                     | Error                 |
| No                  | Yes                    | Long running lock     |
+---------------------+------------------------+-----------------------+

警告:

我不记得了,当您添加导致NULL位图的大小扩展的列时会发生什么。我想说NULL位图代表该行中当前所有列的可空性,但是我无法动弹,说的是肯定的。

编辑-> @MartinSmith指出,仅当更改行时NULL位图才会扩展,非常感谢。但是,正如他还指出的那样,如果行的大小超过SQL Server 2012中8060字节的限制,则为a long running lock may still be required。非常感谢* 2。

第二警告:

测试一下。

第三和最后警告:

不,真的,测试一下。

关于sql - 向大数据库表添加新列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19925074/

10-13 05:40
查看更多