我需要向数据库中的表中添加一个新列。该表包含大约1.4亿行,我不知道如何在不锁定数据库的情况下继续
数据库正在生产中,这就是为什么它必须尽可能平滑
我读了很多书,但从来没有真正得到答案,如果这是一个危险的操作与否。
新列可以为NULL,默认值可以为NULL。据我所知,如果新列需要默认值,则存在更大的问题
对于这件事,我真的很想得到一些直截了当的答案。这是否可行
是的,这是完全可行的
添加一个可以接受NULL且没有默认值的列不需要长时间运行的锁来向表中添加数据
如果提供默认值,那么SQL Server必须更新每条记录,以便将新列值写入行中
一般工作原理:
+---------------------+------------------------+-----------------------+
|列是否可为空?|提供的默认值|结果|
+---------------------+------------------------+-----------------------+
|是|否|快速添加(警告)|
|是|是|长时间运行锁|
|无|无|错误|
|否|是|长时间运行锁|
+---------------------+------------------------+-----------------------+
警告位:
我记不得当你添加一列导致空位图的大小被扩展时会发生什么。我想说空位图表示当前行中所有列的可空性,但我不能把手放在心上说这绝对是真的。
Edit->@MartinSmith指出,空位图只会在行更改时扩展,非常感谢。然而,正如他也指出的,如果行的大小在SQLServer2012中扩展超过8060字节的限制,那么可能仍然需要长时间运行的锁。非常感谢
第二个警告:
测试一下
第三条也是最后一条警告:
不,真的,测试一下