Sql server 例如,nvarchar(最大)的性能是否低于nvarchar(100)?

Sql server 例如,nvarchar(最大)的性能是否低于nvarchar(100)?,sql-server,Sql Server,例如,nvarchar(最大)的性能是否比nvarchar(100)的性能差?同样的问题也得到了回答和解决 引用的答案是: 将数据存储到VARCHAR(N)列时,这些值以相同的方式进行物理存储。但当您将其存储到VARCHAR(MAX)列时,在屏幕后面,数据将作为文本值处理。因此,在处理VARCHAR(MAX)值时需要一些额外的处理。(仅当尺寸超过8000时) VARCHAR(最大值)或NVARCHAR(最大值)被视为“大值类型”。大值类型通常存储为“行外”。这意味着数据行将有一个指向存储“大值”

例如,nvarchar(最大)的性能是否比nvarchar(100)的性能差?

同样的问题也得到了回答和解决

引用的答案是:

将数据存储到VARCHAR(N)列时,这些值以相同的方式进行物理存储。但当您将其存储到VARCHAR(MAX)列时,在屏幕后面,数据将作为文本值处理。因此,在处理VARCHAR(MAX)值时需要一些额外的处理。(仅当尺寸超过8000时)

VARCHAR(最大值)或NVARCHAR(最大值)被视为“大值类型”。大值类型通常存储为“行外”。这意味着数据行将有一个指向存储“大值”的另一个位置的指针


请注意,除此之外,您不能为
nvarchar(max)
列编制索引,因此在这种情况下,它可能是性能方面的限制。

一般规则是使用最适合存储在其中的数据的数据类型。如果您谈论的是varchar(100),那么听起来您不太可能需要存储varchar(max)所能处理的数据,并且可能应该使用varchar(100)

要问自己的问题是,您存储的数据是什么,存储和检索数据的频率是多少。您如何使用它,查找、搜索还是仅存储

至于区别,varchar(max)并不等同于TEXT。varchar(max)中的主要增强是,数据仍然存储在行中,除非超过最大长度8k,在该点上,数据存储在blob中

请参阅这个问题,它更具体地说明了varchar(max)和text之间的区别


是的。比较MAX类型的变量或列时,内部代码使用流语义。长度小于8000的变量类型使用直接比较语义。一个简单的例子:

create table A (k int, x varchar(8000));
create clustered index cdxA on A(k);
go

insert into A (k, x) select number, name from master..spt_values;
go

declare @s datetime = getutcdate(),
  @i int = 0;

set nocount on;
while(@i < 100000)
begin
  declare @x varchar(8000);
  select @x = x from A where k = 1 and x = 'rpc';
  set @i = @i + 1;
end

select datediff(ms, @s, getutcdate());
创建表A(k int,x varchar(8000));
在A(k)上创建聚集索引cdxA;
去
插入到(k,x)中,从主..spt_值中选择数字、名称;
去
声明@s datetime=getutcdate(),
@i int=0;
不计数;
而(@i<100000)
开始
声明@x varchar(8000);
从其中k=1和x='rpc'中选择@x=x;
设置@i=@i+1;
结束
选择datediff(ms、@s、getutcdate());
反复运行该命令会产生278627462746290026232736的测量循环时间,因此平均值约为2.7s

同样的代码,但用varchar(最大值)替换了两次出现的varchar(8000),测得的时间为491652035280504055435130,平均时间为5.2s,显著高于非最大值类型

结论是,在非常紧密的循环中,与非max类型相比,varchar(max)在比较和分配方面较慢。与所有优化一样,只有在仔细测量发现它是一个瓶颈之后,才应该考虑和应用它


请注意,即使在实际长度为3个字符的数据上,差异也是可见的。,并且不是由存储差异产生的。

当varchar中的数据大小(max)超过最大长度时,sql将其存储在blob中。这是否意味着由于这个隐藏的过程,您可能会得到表碎片?