根据以下链接,NULL
值会占用一些存储空间:
https://stackoverflow.com/questions/3731172/how-much-size-null-value-takes-in-sql-server
https://www.sqlservercentral.com/forums/topic/null-storage-2
如果列具有固定宽度数据类型 -NULL
占用列的长度
char(10) NULL takes 10 bytes
INT NULL takes 4 bytes
如果列具有可变宽度 -NULL
占用 0 个字节
varchar(1000) NULL takes 0 bytes (+ 2 bytes of varchar column overhead ?)
此外,还有一个可以为空的列的开销。链接中的信息有点矛盾。
任何人都可以对此有所了解吗?
以下是我的问题:
有人说具有可空列的开销是每行 1 位,有些人说它是每行 1 字节
哪一个是真的?我假设每行 1 位(所以 8 行占 1 个字节),对吗?对于 varchar 中的 NULL 值,每行仍有 2 个字节的开销 - 真的是这样吗?
最重要的问题:
我有一个包含约 2.5 亿行数据的表,总大小约为 115 GB
我使用下面的代码添加了 7 列,在每个命令后使用 sp_spaceused 检查表的大小
添加的列:
alter table MyTable add TestVarchar10 varchar(10) NULL
alter table MyTable add TestVarchar1000 varchar(1000) NULL
alter table MyTable add TestVarchar10DefaultTest varchar(10) NULL default 'test'
alter table MyTable add TestVarchar10DefaultTestWithValues varchar(10) NULL default 'test' with values
alter table MyTable add TestINT int NULL
alter table MyTable add TestINTDefault99 int NULL default 99
alter table MyTable add TestINTDefault99WithValues int NULL default 99 with values
并且任何其他列,根本没有增加表的大小这
怎么可能?我希望表大小会随着NULL
存储占用空间而改变
空位图存储在行级别,因此每行的每 8 列需要 1 个字节。无论该列是否定义为可为空(自 SQL 2000 起),每一行都会产生开销。
列偏移量存储为 NULL 可变长度列(最后一个除外),因此可变长度中的 NULL 值可能会根据位置产生 2 字节的开销。
这就是有趣的地方。SQL Server 企业版(或开发人员版)包括一些优化,使得某些架构修改只是元数据操作。如果您在 Standard 或 Express 版本上运行相同的测试,空间将增加一倍。
请参阅Paul Randal 的记录博客文章剖析。虽然旧,但大多数仍然适用于当前的 SQL Server 版本,包括 Azure SQL 数据库。