How much size "Null" value takes in SQL Server

Roc*_*ngh 113 t-sql sql-server null sql-server-2005

I have a large table with say 10 columns. 4 of them remains null most of the times. I have a query that does null value takes any size or no size in bytes. I read few articles some of them are saying :

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

There is a misconception that if we have the NULL values in a table it doesn't occupy storage space. The fact is, a NULL value occupies space – 2 bytes

SQL:使用NULL值与默认值

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

你可以指导我关于空值的大小.

Mar*_*ers 141

如果字段是固定宽度,则存储NULL将占用与任何其他值相同的空间 - 字段的宽度.

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

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


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

  • 第一篇文章的开头有点误导.该制品不谈论存储NULL值的成本,但具有的成本的能力来存储NULL(即制备柱可为空的成本).确实,在存储空间中花费一些东西来使列可以为空,但是一旦你完成了它,它存储NULL所需的空间比存储一个值所需的空间要少(对于可变宽度列).

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

  • 但是,第二位和第三位,一直到第八位,都适合同一个字节. (16认同)
  • 大多数计算机系统中最小的可寻址存储单元是一个"字节"(通常是8位).所以实际上,`bit`需要一个`byte`.伟大的答案Mark:+1. (12认同)
  • @Martin Smith:我不知道.这使事情变得更复杂,因为如果我理解正确,这意味着使列可以为空可以不增加所需的存储空间(因为空位图总是存在)*除非*该列也在索引中而其他列在索引不可为空.在这种情况下,索引现在必须包含空位图. (2认同)

Joh*_*hnB 30

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

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

例子:

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

注意:在略微切线上,存储大小为varchar输入的数据长度+ 2个字节.

  • 它应该是 + 1 **位** 来标记 NULL。@Akash:不需要 2 个字节,因为位图已经将该值标记为 NULL(不会添加任何信息)。 (2认同)

Kev*_*che 5

从这个链接:

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

对于可变大小的数据类型,实际大小为0字节.

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