SQL Server中“空值”大小占用多less?

我有一个大桌子,说10列。 其中4个大部分时间都是空的。 我有一个查询,空值取任何大小或没有字节大小。 我读了几篇文章,其中一些是说:

http://www.sql-server-citation.com/2009/12/common-mistakes-in-sql-server-part-4.html

有一个误解,如果我们有一个表中的NULL值,它不会占用存储空间。 事实上,一个NULL值占用的空间 – 2个字节

SQL:使用NULL值与默认值

数据库中的NULL值是一个系统值,占用一个字节的存储空间,并指示值不存在,而不是空格或零或任何其他默认值。

你可以请指导我关于空值所采取的大小。

如果该字段是固定的宽度存储NULL与其他任何值 – 字段的宽度相同的空间。

如果该字段是可变宽度,则NULL值不占用空间。

除了存储空值所需的空间外,还有一个可空列的开销。 对于每一行,每个可空列使用一位来标记该列的值是否为空。 无论列是固定的还是长度可变的,都是如此。


您从其他来源获得的信息中观察到的差异的原因:

  • 第一篇文章的开头有点误导。 这篇文章并没有讨论存储一个NULL值的代价,而是存储了一个NULL的代价(也就是使一个列可以为空的代价)。 确实,在存储空间中花费一些东西来使列可以为空,但是一旦你完成了,存储NULL的空间比存储一个值(对于可变宽度的列)花费的空间更less。

  • 第二个链接似乎是关于Microsoft Access的一个问题。 我不知道如何存储NULL的细节,但我不会惊讶,如果它不同于SQL Server。

以下链接声称,如果列是可变长度的,即varchar那么NULL取0字节(加1字节用于标记值是否为NULL ):

  • SQL Server如何真正存储NULL-s

上面的链接以及下面的链接声明,对于固定长度的列(即char(10)intNULL占用列的长度(加上1个字节来标记是否为NULL ):

  • Microsoft SQL Server的数据types性能调优技巧

例子:

  1. 如果将char(10)NULL ,则占用10个字节(清零)
  2. 一个int需要4个字节(也被清零)。
  3. 设置为NULL varchar(1 million)需要0个字节(+ 2个字节)

注意:在一个小的切线上, varchar的存储大小是input数据的长度+ 2个字节。

从这个链接 :

每行都有一个允许空值的列的空位图。 如果该列中的行为null,则位图中的位为1,否则为0。

对于可变大小的数据types,实际大小是0字节。

对于固定大小的数据types,acctual大小是默认数据types大小(以字节为单位)设置为默认值(0表示数字,'表示字符)。

存储NULL值不占用任何空间。

“事实上,一个NULL值占用的空间 – 2个字节”。

这是一个误解 – 这是每行 2个字节,我敢肯定,所有行使用这2个字节,无论是否有任何可空列。

数据库中的NULL值是占用一个字节存储空间的系统值

这是一般的数据库,而不是专门的SQL Server。 SQL Server不使用1个字节来存储NULL值。