1

我有一个在 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

但很好奇为什么会发生这种情况。

4

0 回答 0