我需要向数据库中的表添加新列。该表包含约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/