SQLServer 中“ Null”值的大小是多少

我有一张大桌子,大约有10列。其中4个在大多数情况下仍然是无效的。我有一个查询,空值采用任何大小或没有大小的字节。我读过一些文章,其中一些说:

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

有一种误解认为,如果我们在表中使用 NULL 值,它就不会占用存储空间。事实上,NULL 值占用空间为2个字节

SQL: 使用 NULL 值与默认值

数据库中的 NULL值是一个占用一个字节存储空间的系统值,它表示与空格、零或任何其他默认值相对的值不存在。

能否请您指导我关于大小采取的空值。

78202 次浏览

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

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

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


你从其他来源观察到的信息不一致的原因:

  • 第一篇文章的开头有点误导。本文不讨论存储 NULL 值的成本,而是使用 能力存储 NULL 的成本(即使列为空的成本)。的确,使一个列可以为空需要占用存储空间,但是一旦这样做了,存储 NULL 所需的空间就会比存储值(对于可变宽度的列)所需的空间小。

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

从这个链接 :

每一行对于列都有一个空位图 如果该行中的 列为空,则 位图是1,其他是0。

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

对于固定大小的数据类型 中的默认数据类型大小 字节设置为默认值(0表示 数字)。

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

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

例子:

  1. 如果将 char(10)设置为 NULL,它将占用10个字节(归零)
  2. int占用4个字节(也为零)。
  3. 设置为 NULLvarchar(1 million)占用0字节(+ 2字节)

注意: 稍微切一下,varchar的存储大小是输入的数据长度 + 2字节。

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

”事实上,NULL 值占用 太空 -2字节”

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

数据库中的 NULL 值是一个系统 占用一个字节的 储藏室

这里所说的是一般的数据库,而不是具体的 SQLServer。SQLServer 不使用1字节来存储 NULL 值。

尽管这个问题被明确标记为 SQL Server 2005,因为它现在是2021,但应该指出的是,对于2005年之后的任何版本的 SQL Server 来说,这都是一个“陷阱问题”。

这是因为如果使用 ROW 或 PAGE 压缩,如果列被定义为 SPARSE,那么 或者将在实际行中存储“ NULL 值”。这些是在 SQLServer2008中添加的。

行压缩(这是页压缩的先决条件)的执行说明指出:

所有数据类型的 NULL 和0值都进行了优化,并且没有使用 bytes1

虽然在每个物理记录 2中,每个非稀疏列仍然存储最少的元数据(每列4位 + (记录开销/列)) ,但严格来说这不是值,在所有情况下都是必需的。

具有 NULL 值的 SPARSE 列不占用空间,也不占用相关的每行元数据(随着 SPARSE 列数量的增加) ,即 尽管需要权衡非 NULL 值

因此,如果不分析实际的 DB 使用统计数据,就很难“计算”空间。每行平均字节数将根据精确的列类型、表/索引重建设置、实际数据和重复性、填充容量、有效的页面利用率、碎片化、 LOB 使用情况等因素而有所不同,它通常是一个更有用的指标。

1 SQLite 使用类似的方法可以有效地免除 NULL 值。

2 可以在“ SQLServer2012内部构件: 特殊存储”中找到 ROW (也就是 PAGE)压缩所采用的技术布局简介。

在列数的1或2字节后面是 CD 数组,它对表中的每个列使用4位[元数据]来表示有关列长度的信息。.0(0 × 0)表示对应的列为 NULL。

3 有趣的事实: 对于 ROW 压缩,位列值完全存在于相应的4位元数据中。