例如,nvarchar(max)的性能是否比nvarchar(100)低?

时间:2010-03-17 07:54:55

标签: sql-server

nvarchar(max)的性能是否比nvarchar(100)低?

4 个答案:

答案 0 :(得分:5)

同样的问题已经回答here (SO)here (MSDN)

引用David Kreps的答案:

  

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

     

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

答案 1 :(得分:4)

请注意,除了Alex's answer之外,您无法为nvarchar(max)列编制索引,因此在这种情况下,这可能是性能方面的限制。

答案 2 :(得分:2)

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

要问自己的问题是您存储的数据,存储和重新存储的频率。你是如何使用它,查找,搜索或存储的?

至于差异,varchar(max)不等同于TEXT。 varchar(max)的主要增强功能是数据IS仍然存储在行中,除非超过8k的最大长度,此时点存储在blob中。

请参阅此问题,该问题更具体地说明了varchar(max)和text之间的差异。

Using varchar(MAX) vs TEXT on SQL Server

答案 3 :(得分:2)

是。比较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());

重复运行会产生测量的循环时间为2786,2746,2746,2900,2623,2736,所以平均值为2.7s左右。

完全相同的代码,但用varchar(max)替换了两个出现的varchar(8000)产生的测量时间分别为4916,5203,5280,5040,5543,5130,平均时间5.2s显着高于非-max型。

结论是,在非常紧密的循环中,与非最大类型相比,varchar(max)在比较和分配时更慢。与所有优化一样,只有在仔细测量后才会考虑并应用它,这是一个瓶颈。

请注意,即使对于实际长度为3个字符的数据,差异也是可见的,并且不是来自存储差异。