SQL Server中“ Null”值的大小


118

我有一张有10列的大桌子。大多数情况下,其中4个仍然为空。我有一个查询,该查询不将null值设为任何大小或不包含字节大小。我读了几篇文章,其中有些在说:

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

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

SQL:使用NULL值与默认值

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

您能否指导我有关空值占用的大小。

Answers:


146

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

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

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


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

  • 第一篇文章的开头有点误导。本文不是在讨论存储NULL值的成本,而是在具有存储NULL 的能力的成本(即使列为可空的成本)。的确,使列可为空会花费一些存储空间,但是一旦完成,存储NULL所需要的空间就比存储值(对于可变宽度列)要少。

  • 第二个链接似乎是有关Microsoft Access的问题。我不知道Access如何存储NULL的详细信息,但是如果它与SQL Server不同,我也不会感到惊讶。


1
@Mark“的确,使列可为空是在存储空间上花费了一些钱,但是一旦完成,存储NULL所需要的空间比存储值(对于可变宽度的列)要少”。可以说,可变数据类型在内存中的大小为1位。
洛基·辛格

13
在大多数计算机系统中,内存的最小可寻址单元是1 byte(通常为8位)。因此,实际上,a bit需要一个byte。好答案马克:+1。
JohnB

20
但是,第二个和第三个位,一直到第八个位都适合同一字节。
Matti Virkkunen

1
@Mark-是的,看起来更清晰了。对于消失的评论表示歉意。我本打算进行修改,但是在删除和提交之间我的Internet连接断开了!它也取决于一点(从此处的注释部分开始) “对于堆和聚集索引记录,总是有一个NULL位图。对于非聚集索引,如果索引中的所有列都不为NULL,则不会存在。”
马丁·史密斯

2
@马丁史密斯:我不知道。这会使事情变得更加复杂,因为如果我正确理解它,则意味着将列设置为可空状态不会增加所需的存储空间(因为始终存在空位图),除非该列也位于索引中,而该列也位于索引中不能为空。在这种情况下,索引现在必须包含一个空位图。
Mark Byers 2010年

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个字节。


存储NULL的varchar会占用0 + 2 + 1(NULL开销)字节吗?
阿卡什(Akash)2015年

它应为+1 以标记为NULL。@Akash:不需要2个字节,因为位图已将值标记为NULL(不会添加任何信息)。
SimoKivistö18年

5

从此链接

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

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

对于固定大小的数据类型,实际大小是设置为默认值的默认数据类型大小(以字节为单位)(数字为0,字符为”)。


您的意思是说,对于像nvarchar(max)varchar(max)这样的数据类型,Null将占用0个字节,而对于int,chars等,它将默认大小更改为它们具有的默认值?
Rocky Singh 2010年

4

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

“事实是,NULL值占用空间-2个字节。”

这是一个误解- 每行 2个字节,而且我很确定所有行都使用这2个字节,而不管是否有任何可为空的列。

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

这通常是在谈论数据库,而不是在专门讨论SQL Server。SQL Server不使用1个字节来存储NULL值。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.