1

似乎很难找到有关此的准确信息。MSDN有一篇关于稀疏列的文章,以及在使用它们时应考虑哪些空百分比阈值。但是关于默认空存储空间使用的事实似乎很难得到。

一些消息来源声称 NULL 值不占用任何空间,但这意味着稀疏列首先毫无意义。有人声称只有表定义中的空位图会添加一个位来表示每个可为空的列,但没有进一步的开销。一些人声称固定长度的列(char、int、bigint 等)实际上使用了相同数量的存储空间,而不管值是否为空。

那么它是什么,真的吗?

假设我有一个数据库中所有可空列的列表,其中包含表中的总行数,以及每列和类型的 NULL 行数。我将如何准确计算 NULL 值现在使用了多少空间,然后我可以通过将列更改为稀疏来准确预测节省了多少空间?我可以很好地将 4 字节开销添加到非空行,但是当我不知道如何处理空行时它没有帮助?

4

1 回答 1

2
  • 对于诸如 的固定长度类型int NULL,它始终使用类型的长度(即,对于 int 而言,无论它设置为 NULL 还是 NOT NULL,都是 4 个字节)。

  • 对于可变长度类型,在可变长度列偏移列表中存储 NULL + 2 个字节需要 0 个字节。这用于记录每个可变长度值实际存储在页面上的行中的位置。

此外,NULL 或 NOT NULL 标志对每列使用 1 位。具有 12 列的表将使用 12/8 字节(=2 字节 NULL 位图)。

此链接将为您提供有关该主题的更多信息

知道 NULL 的百分比后,您可以查看此链接以估算潜在收益。Sparse 节省了空值的空间,但将需要更多的空间来存储非空值。

于 2015-08-17T08:38:54.530 回答