Sql server NVARCHAR(最大)是否比NVARCHAR(N)消耗更多的存储空间(物理大小)

Sql server NVARCHAR(最大)是否比NVARCHAR(N)消耗更多的存储空间(物理大小),sql-server,database,tsql,size,nvarchar,Sql Server,Database,Tsql,Size,Nvarchar,在SQL Server中,如果创建一个NVARCHAR(MAX)类型的列,并且只在其中填充128个字符,那么它是否比创建为NVARCHAR(128)类型的列消耗更多的存储空间?或者它的大小相同?我做了一个小实验,使用以下代码创建2个表,并用同样随机的128个字符填充该表: CREATE TABLE dbo.MyTextFix ( [val] NVARCHAR(128) NOT NULL ) CREATE TABLE dbo.MyTextMax ( [val] NVARCHAR(M

在SQL Server中,如果创建一个
NVARCHAR(MAX)
类型的列,并且只在其中填充128个字符,那么它是否比创建为
NVARCHAR(128)
类型的列消耗更多的存储空间?或者它的大小相同?

我做了一个小实验,使用以下代码创建2个表,并用同样随机的128个字符填充该表:

CREATE TABLE dbo.MyTextFix (
    [val] NVARCHAR(128) NOT NULL
)
CREATE TABLE dbo.MyTextMax (
    [val] NVARCHAR(MAX) NOT NULL
)

SET NOCOUNT ON;
DECLARE @COUNT INT = 0
WHILE (@COUNT <= 100000)
BEGIN
    DECLARE @VAL NVARCHAR(128) = CAST(NEWID() AS NVARCHAR(128)) + '-' + CAST(NEWID() AS NVARCHAR(128)) + '-' + CAST(NEWID() AS NVARCHAR(128)) + '-' + CAST(NEWID() AS NVARCHAR(128))
    INSERT INTO dbo.MyTextFix ([val]) VALUES (@VAL)
    INSERT INTO dbo.MyTextMax ([val]) VALUES (@VAL)
    SET @COUNT = @COUNT + 1
END
创建表dbo.MyTextFix(
[val]NVARCHAR(128)不为空
)
创建表dbo.MyTextMax(
[val]NVARCHAR(最大值)不为空
)
不计数;
声明@COUNT INT=0

(@计数< p>存储可能相同),需要考虑以下

  • MAX将在LOB分配中的行外存储数据
  • 当您使用MAX并运行查询时,优化器可能会授予不必要的更多内存

  • 当值被存储在行中时,空间将是相同的。如果由于行/页中的其他列需要将其存储在行之外,则max类型将更大。除了存储之外,考虑SQL Server将需要考虑查询计划中的最大类型的可能内存,所以不要使用VARCHAR(MAX)。除非您需要超过4000个字符。要添加到@ DanGuzman的注释中,我将列数据类型宽度视为一种约束。如果您编写的应用程序预期不超过(在示例中)128个字符,则使其成为<代码> NVARCHAR(128)< /代码>,而不管是否<代码> NVARCHAR(MAX)。
    将这些相同的字符存储在等量的存储器中。