我有一个在 varbinary(max) 列中保存文件数据的表,并且正在将其转换为使用 FILESTREAM 列以便将数据保存在文件系统上。
作为其中的一部分,我有一个 SQL 更新脚本,它添加了新的 FILESTREAM 列:
ALTER TABLE [dbo].[File] ADD [Data] VARBINARY(MAX) FILESTREAM NULL
然后我将旧文件数据迁移到新的数据列。这会将文件数据保存到大小为 20GB 的磁盘。
然后我更改该列,使其不为空
ALTER TABLE [dbo].[File] ALTER COLUMN [Data] VARBINARY(MAX) FILESTREAM NOT NULL
但这会在磁盘上创建文件流数据的新副本(在文件组位置的新文件夹中),给我留下另外 20GB 的副本。
我很好奇为什么将列更改为不为空的行为会重复数据?如果它是一个新列并因此复制数据是有意义的,但是在其他所有内容保持不变的情况下,仅复制现有数据几乎没有意义——更不用说复制价值 20GB 的文件所需的时间了。
我可以将列添加更改为具有默认值,这不会导致重复:
ALTER TABLE [dbo].[File] ADD [Data] VARBINARY(MAX) FILESTREAM NOT NULL DEFAULT(0x0)
然后
ALTER TABLE [dbo].[File] ADD [Data] VARBINARY(MAX) FILESTREAM NOT NULL
但很好奇为什么会发生这种情况。