似乎很难找到关于此的准确信息。 MSDN有一篇关于稀疏列的文章,在使用它们时应该考虑空百分比阈值。但是有关默认空存储空间使用的事实似乎很难得到。
有些消息来源声称NULL值不占用任何空间,但这意味着稀疏列首先是毫无意义的。有些人声称只有表定义中的空位图会添加一个代表每个可空列的位,但是没有进一步的开销。有人声称固定长度列(char,int,bigint等)实际上占用了相同数量的存储空间,无论该值是否为空。
那是哪个,真的吗?
假设我有一个列表,其中包含数据库中所有可以为空的列,其中包含表中的总行数,以及每列和类型的NULL行数。我如何准确计算NULL值现在使用了多少空间,因此我可以通过将列更改为稀疏来准确预测节省多少空间?我可以很好地将4字节开销添加到非空行,但是当我不知道如何处理空行时它没有帮助吗?
答案 0 :(得分:2)
对于int NULL
等固定长度类型,它总是使用类型的长度(即int为4个字节,无论它是设置为NULL还是非NULL)。
对于可变长度类型,在可变长度列偏移列表中存储NULL + 2个字节需要0个字节。这用于记录每个变量长度值实际存储在页面行中的位置。
此外,NULL或NOT NULL标志为每列使用1位。具有12列的表将使用12/8字节(= 2字节NULL位图)。
This link will give you a lot more information on the subject
一旦你知道了NULL的百分比,你可以查看这个link来估算潜在的收益。稀疏在空值上节省空间,但是对于非空值将占用更多空间。