空字符串采用的SQL Server空间?

时间:2015-04-01 00:52:37

标签: sql-server sql-server-2012

SQL Server 2012及更高版本中varchar类型占用的空间是多少?也就是说,如果我有3列类型为nvarchar(或varchar的列),并且它们都是空的,那么表中会占用多少空间?

CREATE TABLE dbo.ReferringUrl 
(
     Id int IDENTITY(1, 1) NOT NULL,
     RequestUrl nvarchar(384) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
     ReferringUrlName nvarchar(384) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
     ReferringIpAddress nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
)

2 个答案:

答案 0 :(得分:4)

非空varchar(n)值需要2个字节的长度加上每个字符1个字节。 nvarchar(n)每个字符需要2个字节。零长度字符串对于varchar和nvarchar只需要2个字节,对于长度需要2个字节,对于值只需要零个字节。 NULL值根本不需要空格,因为空位图中的相应位表示该值为null且不存储长度或值。

启用页面压缩时,空间要求不同。在这种情况下,空间需求取决于前缀和字典压缩。

答案 1 :(得分:1)

您可以使用DBCC PAGE或SQL Server内部查看器自行测试。

以下是一些示例,说明了以下几点。

  1. 除了列偏移数组中的2个字节(第4行和第5行)之外,空白或空的varchar列不占用任何空间。
  2. 如果变量长度列为null或为空且仅后跟其他空值/空值,则这些尾随空列中的任何一列都不需要列偏移数组中的2个字节(第6行和第7行)。
  3. 如果所有可变长度列都为null或为空,则该行根本没有可变长度部分(第2行和第3行)。

  4. INSERT dbo.ReferringUrl
           (Id,
            RequestUrl,
            ReferringUrlName,
            ReferringIpAddress)
    VALUES (1,N'AAA','BBB','CCC'),
           (2,NULL,NULL,NULL),
           (3,'','',''),
           (4,NULL,NULL,'CCC'),
           (5,'','','CCC'),
           (6,'AAA',NULL,NULL),
           (7,'AAA','',''),
           (8,N'AAA','BBB','CCC') 
    

    1 - 所有列都有值

    enter image description here

    上面的图片来自SQL Server内部查看器 - 它还有助于为下面显示的行中的各个组件提供密钥。

    enter image description here

    2 - 所有varchar列都为NULL

    enter image description here

    3 - 所有varchar列都有空字符串

    enter image description here

    4 - 除最后一个

    外,所有varchar列都为null

    enter image description here

    5 - 除最后一个

    外,所有varchar列都为空

    enter image description here

    6 - 除第一个

    外,所有varchar列都为null

    enter image description here

    7 - 除第一个

    外,所有varchar列都为空

    (由于内部查看器中的错误,这不会突出显示,但请注意它与前一行的长度相同)

    enter image description here