向大数据库表中添加新列

我需要向数据库中的表中添加一个新列。该表包含大约1.4亿行,我不知道如何在不锁定数据库的情况下继续

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

我读了很多书,但从来没有真正得到答案,如果这是一个危险的操作与否。
新列可以为NULL,默认值可以为NULL。据我所知,如果新列需要默认值,则存在更大的问题

对于这件事,我真的很想得到一些直截了当的答案。这是否可行

是的,这是完全可行的

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

如果提供默认值,那么SQL Server必须更新每条记录,以便将新列值写入行中

一般工作原理:

+---------------------+------------------------+-----------------------+
|列是否可为空?|提供的默认值|结果|
+---------------------+------------------------+-----------------------+
|是|否|快速添加(警告)|
|是|是|长时间运行锁|
|无|无|错误|
|否|是|长时间运行锁|
+---------------------+------------------------+-----------------------+

警告位:

我记不得当你添加一列导致空位图的大小被扩展时会发生什么。我想说空位图表示当前行中所有列的可空性,但我不能把手放在心上说这绝对是真的。

Edit->@MartinSmith指出,空位图只会在行更改时扩展,非常感谢。然而,正如他也指出的,如果行的大小在SQLServer2012中扩展超过8060字节的限制,那么可能仍然需要长时间运行的锁。非常感谢

第二个警告:

测试一下

第三条也是最后一条警告:

不,真的,测试一下

发表评论