SQL Server 空间被空字符串占用?

Pet*_*ner 5 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,
)
Run Code Online (Sandbox Code Playgroud)

Mar*_*ith 6

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

下面举一些例子来说明以下几点。

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

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') 
Run Code Online (Sandbox Code Playgroud)

1 - 所有列都有值

在此输入图像描述

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

在此输入图像描述

2 - 所有 varchar 列均为 NULL

在此输入图像描述

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

在此输入图像描述

4 - 除最后一列外,所有 varchar 列均为空

在此输入图像描述

5 - 除最后一列外,所有 varchar 列均为空

在此输入图像描述

6 - 除第一个列外的所有 varchar 列均为空

在此输入图像描述

7 - 除第一个列外,所有 varchar 列均为空

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

在此输入图像描述