Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 多大尺寸;空";SQL Server中的值_Sql Server_Tsql_Sql Server 2005_Null - Fatal编程技术网

Sql server 多大尺寸;空";SQL Server中的值

Sql server 多大尺寸;空";SQL Server中的值,sql-server,tsql,sql-server-2005,null,Sql Server,Tsql,Sql Server 2005,Null,我有一张大桌子,大概有10列。其中4个在大多数情况下保持为空。我有一个查询,它不接受null值,它可以接受任何大小,也可以不接受字节大小。我读了几篇文章,其中一些文章说: 有一种误解是,如果表中有空值,它就不会占用存储空间。事实上,空值占用空间–2字节 数据库中的NULL值是一个系统值,它占用一个字节的存储空间,并指示与空格、零或任何其他默认值相对的值不存在 你能告诉我空值的大小吗。如果字段是固定宽度,空值与任何其他值占用相同的空间-字段的宽度 如果字段宽度可变,则空值不占用任何空间 除了存

我有一张大桌子,大概有10列。其中4个在大多数情况下保持为空。我有一个查询,它不接受null值,它可以接受任何大小,也可以不接受字节大小。我读了几篇文章,其中一些文章说:

有一种误解是,如果表中有空值,它就不会占用存储空间。事实上,空值占用空间–2字节

数据库中的
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(不会添加任何信息)。