是时候通过方法将默认值添加到新列了
Time to add default values to a new column by approach
我需要向现有 SQL table 添加一个新的非空列并将其设置为默认值。我知道有两种不同的方法:
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 会产生大量日志。我一直在尝试重现这一点,但还没有成功。可能是我的示例数据集太小,他所描述的内容仅在大型数据库或特定模式下才明显。
与其花时间生成越来越大的数据集并反复修改模式,我想我应该求助于这里的专家并获得瘦身。第二种方法实际上对大型数据集更好吗?
所以我决定测试一下。
在 Sql 服务器 2012 上, 不到一秒 对具有超过 1360 万条记录的 table 执行第一次更改 table。
第二种方法,用了49秒,所以我想说你的开发是错误的。
我需要向现有 SQL table 添加一个新的非空列并将其设置为默认值。我知道有两种不同的方法:
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 会产生大量日志。我一直在尝试重现这一点,但还没有成功。可能是我的示例数据集太小,他所描述的内容仅在大型数据库或特定模式下才明显。
与其花时间生成越来越大的数据集并反复修改模式,我想我应该求助于这里的专家并获得瘦身。第二种方法实际上对大型数据集更好吗?
所以我决定测试一下。
在 Sql 服务器 2012 上, 不到一秒 对具有超过 1360 万条记录的 table 执行第一次更改 table。
第二种方法,用了49秒,所以我想说你的开发是错误的。