nvarchar(max)的性能是否比nvarchar(100)低?
答案 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之间的差异。
答案 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个字符的数据,差异也是可见的,并且不是来自存储差异。