我需要在现有SQL表中添加一个新的非空列,并将其设置为默认值。我知道有两种不同的方法:
ALTER TABLE Foo
ADD Col CHAR(1) NOT NULL DEFAULT('N')
ALTER TABLE Foo
ADD Col CHAR(1)
GO
UPDATE Foo SET Col = 'N'
GO
ALTER TABLE Foo ALTER COLUMN Col CHAR(1) NOT NULL DEFAULT('N')
也就是说,在第二种方法中,有三个单独的批次:首先创建列,然后回填默认值,然后添加not null
约束和默认值。
这里的一个开发人员声称第二种方法更快,导致锁定时间更短,而#1方法导致巨大的日志。我一直试图重现这一点,但尚未能够重现。可能是我的样本数据集太小,而他所描述的内容仅在大型数据库或特定模式中显而易见。
我没有花时间生成越来越大的数据集并反复修改架构,我想我会转向这里的专家并获得瘦身。对于大型数据集,第二种方法实际上更好吗?
答案 0 :(得分:2)
所以我决定测试一下。
在Sql server 2012上,少于一秒在具有超过1360万条记录的表上执行第一个alter table。
对于第二种方法,它花了 49秒,所以我会说你的开发是错误的。