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)
或int
, NULL
占用列的长度(加上1个字节来标记是否为NULL
):
- Microsoft SQL Server的数据types性能调优技巧
例子:
- 如果将
char(10)
为NULL
,则占用10个字节(清零) - 一个
int
需要4个字节(也被清零)。 - 设置为
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值。