首先请原谅我的语法,因为英语不是我的主要关键:)
我试图找出将varbinary(max)更改为varbinary(300)是否会减少表的物理磁盘空间使用量。
我们的物理磁盘空间非常有限,并且正在尝试优化所有地方,包括数据库中的列。
我们有> 100列(在具有数百万行的不同表中),varbinary(max)数据类型用于存储加密值,我们不需要最大长度,因为它适合于< 300长度。
除了以下行之外,我无法找到任何地方: “存储大小是输入数据的实际长度+ 2个字节。”
https://docs.microsoft.com/en-us/sql/t-sql/data-types/binary-and-varbinary-transact-sql
Aly帮助回答上述3个问题将不胜感激。感谢。
答案 0 :(得分:1)
如果所有二进制值都适合300个字节,那么就所使用的空间而言,它将完全没有变化。这是因为这些值已经存储在行中。
SQL Server存储(MAX)数据的格式 列,例如varchar(max),nvarchar(max)和varbinary(max), 取决于实际的数据大小。 SQL Server将其存储在行中 可能。当行内分配不可能时,数据大小较小 它大于或等于8,000字节,存储为行溢出数据。该 超过8,000字节的数据存储为LOB数据
因此,当您将其更改为varbinary(300)时,它将进行瞬时操作,仅更改元数据。
不,它没有。
可变长度数据类型,例如varchar,varbinary和一些 其他人,使用尽可能多的存储空间来存储数据,以及 两个额外的字节
不,如上所述,它将需要存储实际值的大小,所以如果你将一个3字节的值放入varchar(max)列,它将只使用5个字节,如果ypu放入一个空值它将仅使用2个字节(如果空值在最后一列中,则根本不占用空间)
当你将varbinary(max)变为varbinary(300)时,我说它将不会更改任何数据(仅限元数据),但是如果您使用新值更新行,则旧列将被删除并且新列将被删除将被创建,所以不仅你没有获得空间,你将浪费空间,因为用于旧列的空间将不会被释放,它将仅被标记为已删除
文学: