我需要在数据库中的表中添加一个新的列.该表包含大约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位图表示当前行中所有列的可空性,但我不能把我的手放在我的心上,并且说这绝对是真的.
编辑 – > @MartinSmith指出,NULL位图只会在行发生变化时展开,非常感谢.但是,正如他还指出,如果行的大小扩展到sql Server 2012的8060字节限制,那么a long running lock may still be required.非常感谢* 2.
第二个警告:
测试它
第三和最后的警告:
不,真的,测试.