将varbinary(MAX)更改为varbinary(300)是否会对物理磁盘空间产生任何影响?

时间:2017-05-19 15:57:44

标签: sql sql-server sqldatatypes

首先请原谅我的语法,因为英语不是我的主要关键:)

我试图找出将varbinary(max)更改为varbinary(300)是否会减少表的物理磁盘空间使用量。

我们的物理磁盘空间非常有限,并且正在尝试优化所有地方,包括数据库中的列。

我们有> 100列(在具有数百万行的不同表中),varbinary(max)数据类型用于存储加密值,我们不需要最大长度,因为它适合于< 300长度。

  1. 如果我们切换到varbinary(300),磁盘空间是否有任何增益?
  2. varbinary(max)在创建表格或将数据插入该列时是否预先分配了所有必需的磁盘空间?
  3. varbinary(max)列是否占用了所有磁盘空间,即使它具有长度<300的数据?
  4. 除了以下行之外,我无法找到任何地方: “存储大小是输入数据的实际长度+ 2个字节。”

    https://docs.microsoft.com/en-us/sql/t-sql/data-types/binary-and-varbinary-transact-sql

    Aly帮助回答上述3个问题将不胜感激。感谢。

1 个答案:

答案 0 :(得分:1)

  • 如果我们切换到varbinary(300),是否有任何磁盘空间增益?

如果所有二进制值都适合300个字节,那么就所使用的空间而言,它将完全没有变化。这是因为这些值已经存储在行中。

  

SQL Server存储(MAX)数据的格式   列,例如varchar(max),nvarchar(max)和varbinary(max),   取决于实际的数据大小。 SQL Server将其存储在行中   可能。当行内分配不可能时,数据大小较小   它大于或等于8,000字节,存储为行溢出数据。该   超过8,000字节的数据存储为LOB数据

因此,当您将其更改为varbinary(300)时,它将进行瞬时操作,仅更改元数据。

  • varbinary(max)是否预先分配了所有必需的磁盘空间 创建表或将数据插入该列?

不,它没有。

  

可变长度数据类型,例如varchar,varbinary和一些   其他人,使用尽可能多的存储空间来存储数据,以及   两个额外的字节

  • varbinary(max)列是否占用其所有磁盘空间,即使它具有 长度<300?
  • 的数据

不,如上所述,它将需要存储实际值的大小,所以如果你将一个3字节的值放入varchar(max)列,它将只使用5个字节,如果ypu放入一个空值它将仅使用2个字节(如果空值在最后一列中,则根本不占用空间)

当你将varbinary(max)变为varbinary(300)时,我说它将不会更改任何数据(仅限元数据),但是如果您使用新值更新行,则旧列将被删除并且新列将被删除将被创建,所以不仅你没有获得空间,你将浪费空间,因为用于旧列的空间将不会被释放,它将仅被标记为已删除

文学:

  1. Microsoft SQL Server 2012 Internals (Developer Reference) by Kalen Delaney
  2. Pro SQL Server Internals by Dmitri Korotkevitch