Sql server 多大尺寸;空";SQL Server中的值
我有一张大桌子,大概有10列。其中4个在大多数情况下保持为空。我有一个查询,它不接受null值,它可以接受任何大小,也可以不接受字节大小。我读了几篇文章,其中一些文章说: 有一种误解是,如果表中有空值,它就不会占用存储空间。事实上,空值占用空间–2字节 数据库中的Sql server 多大尺寸;空";SQL Server中的值,sql-server,tsql,sql-server-2005,null,Sql Server,Tsql,Sql Server 2005,Null,我有一张大桌子,大概有10列。其中4个在大多数情况下保持为空。我有一个查询,它不接受null值,它可以接受任何大小,也可以不接受字节大小。我读了几篇文章,其中一些文章说: 有一种误解是,如果表中有空值,它就不会占用存储空间。事实上,空值占用空间–2字节 数据库中的NULL值是一个系统值,它占用一个字节的存储空间,并指示与空格、零或任何其他默认值相对的值不存在 你能告诉我空值的大小吗。如果字段是固定宽度,空值与任何其他值占用相同的空间-字段的宽度 如果字段宽度可变,则空值不占用任何空间 除了存
NULL
值是一个系统值,它占用一个字节的存储空间,并指示与空格、零或任何其他默认值相对的值不存在
你能告诉我空值的大小吗。如果字段是固定宽度,空值与任何其他值占用相同的空间-字段的宽度 如果字段宽度可变,则空值不占用任何空间 除了存储空值所需的空间之外,还存在具有可空列的开销。对于每一行,每个可空列使用一位来标记该列的值是否为空。无论列的长度是固定的还是可变的,都是如此
您在其他来源的信息中发现差异的原因:
- 第一篇文章的开头有点误导。本文讨论的不是存储NULL值的成本,而是能够存储NULL值的成本(即使列可为NULL的成本)。确实,使列可为NULL需要花费一些存储空间,但一旦这样做了,存储NULL所需的空间将少于存储值(对于可变宽度列)所需的空间
- 第二个链接似乎是关于Microsoft Access的问题。我不知道Access如何存储空值的细节,但如果它与SQL Server不同,我也不会感到惊讶
- :
每行的列都有一个空位图
允许为空。如果那一行
列为null,则在
位图为1,否则为0
对于可变大小的数据类型
实际大小为0字节
对于固定大小的数据类型,acctual
size是中的默认数据类型大小
字节设置为默认值(0表示
数字,“”表示字符)
下面的链接声称,如果列是可变长度的,即
varchar
,那么NULL
需要0个字节(加上1个字节用于标记值是否为NULL
):
char(10)
或int
,值NULL
占用列的长度(加上1个字节以标记它是否NULL
):
char(10)
设置为NULL
,它将占用10个字节(调零)int
需要4个字节(也被调零)varchar(100万)
设置为NULL
需要0字节(+2字节)注意:稍微相切一下,
varchar
的存储大小是输入的数据长度+2字节。存储空值不占用任何空间
“事实是,空值占据
空格–2个字节。“
这是一个错误的概念——每行2个字节,我很确定所有行都使用这2个字节,不管是否有任何可为空的列
数据库中的空值是一个系统
值,该值占用
储藏
这里讨论的是一般的数据库,而不是SQL Server。SQL Server不使用1字节来存储空值。您的意思是说,对于像nvarchar(max)varchar(max)这样的数据类型,空值将占用0字节,而对于int、chars等数据类型,默认大小将占用它们的默认值?@Mark“确实,使列可为空需要花费一些存储空间,但一旦这样做,存储空值所需的空间将少于存储值所需的空间(对于可变宽度列)“你的意思是说,可变数据类型的内存大小为1位。在大多数计算机系统中,最小的可寻址内存单元是一个
字节(通常为8位)。所以在现实中,位
取字节
。很好的答案标记:+1。但是,第二位和第三位,一直到第八位都可以放在同一个字节中。@Mark-是的,看起来更清楚了。为消失的评论道歉。我本想修改它,但我的网络连接在删除和提交之间中断了!它还“对于堆和聚集索引记录,总是有一个空位图。对于非聚集索引,如果索引中的所有列都不是空的,则不会有空位图。”@Martin Smith:我不知道。这使事情变得更复杂,因为如果我理解正确,这意味着使列可为空不会增加所需的存储空间(因为空位图始终存在),除非该列也在索引中,并且索引中的其他列不可为空。在这种情况下,索引现在必须包含一个空位图。存储空的varchar不需要0+2+1(空开销)字节吗?它应该是+1位来标记空@Akash:2字节应该不是必需的,因为位图已经将该值标记为NULL(不会添加任何信息)。