Ale*_*sko 2 null sql-server storage sql-server-2017
根据以下链接,NULL
值占用一些存储空间:
/sf/ask/261182071/
https://www.sqlservercentral.com/forums/topic/null-storage-2
如果列具有固定宽度数据类型 -NULL
占用列的长度
char(10) NULL takes 10 bytes
INT NULL takes 4 bytes
Run Code Online (Sandbox Code Playgroud)
如果列具有可变宽度 -NULL
占用 0 字节
varchar(1000) NULL takes 0 bytes (+ 2 bytes of varchar column overhead ?)
Run Code Online (Sandbox Code Playgroud)
另外,拥有可为空的列也会产生开销。链接中的信息有点矛盾。
任何人都可以阐明这一点吗?
这是我的问题:
有人说可空列的开销是每行 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
Run Code Online (Sandbox Code Playgroud)
并且任何附加列都根本没有增加表的大小,
这是怎么回事?我预计表大小会随着NULL
存储占用空间而改变
有人说可空列的开销是每行 1 位,有人说是每行 1 个字节,哪一个是正确的?我假设每行 1 位(因此 8 行构成 1 个字节),对吗?
空位图存储在行级别,因此每行的每 8 列需要 1 个字节。无论列是否定义为可为空(自 SQL 2000 起),每行都会产生开销。
对于 varchar 中的 NULL 值,每行仍然有 2 个字节的开销 - 这是真的吗?
列偏移量是为 NULL 可变长度列存储的(最后一个列除外),因此可变长度中的 NULL 值可能会产生 2 字节的开销,具体取决于位置。
最重要的问题:我有一个包含约 2.5 亿行数据的表,总大小约为 115 GB 我使用下面的代码添加了 7 列,在每个命令后使用 sp_spaceused 检查表的大小
这就是有趣的地方。SQL Server Enterprise Edition(或 Developer Edition)包括一些优化,使得某些架构修改仅是元数据操作。如果您在标准版或快速版上运行相同的测试,空间将增加一倍。
请参阅Paul Randal 的博客文章剖析。虽然很旧,但大多数仍然适用于当前的 SQL Server 版本,包括 Azure SQL 数据库。