这里的问题很简单但是我搜索了很多,但我还没有在互联网上找到答案..
在过程参数和变量声明中使用nvarchar(max)与nvarchar(n)相比是否有任何缺点? (不是为了存储,只是为了执行)
让我举个例子
CREATE PROCEDURE prFoo
@pParam1 NVARCHAR(MAX)
@pParam2 NVARCHAR(32)
....
DECLARE @dVariable1 NVARCHAR(MAX)
DECLARE @dVariable2 NVARCHAR(32)
....
(@ pParam1,@ dVariable1)和(@ pParam2,@ dVariable2)之间是否存在任何性能差异?
答案 0 :(得分:0)
实际上,当我进行此测试时,我期望没有差异,但是结果让我感到震惊
在我用来测试的代码下面共享
declare @i int = 0
declare @n int = 1000000
declare @memlimit int = 3072
declare @limited NVARCHAR(3072) = ''
declare @unlimited NVARCHAR(MAX) = ''
declare @start DATETIME
declare @limitedMS INT
declare @unlimitedMS INT
-- measure @limited case
set @i = 0
set @start = GETDATE()
while (@i < @n)
begin
set @limited = @limited + 'a'
if len(@limited) = @memlimit
begin
set @limited = ''
end
set @i = @i + 1
end
set @limitedMS = DATEDIFF(MILLISECOND, @start, GETDATE())
-- measure @unlimited case
set @i = 0
set @start = GETDATE()
while (@i < @n)
begin
set @unlimited = @unlimited + 'a'
if len(@unlimited) = @memlimit
begin
set @unlimited = ''
end
set @i = @i + 1
end
set @unlimitedMS = DATEDIFF(MILLISECOND, @start, GETDATE())
select @limitedMS as LimitedMS, @unlimitedMS as UnlimitedMS
输出如下所示
LimitedMS UnlimitedMS
1816 3373
如您所见,即使我使用@memlimit来限制@unlimited变量的内存分配,它的工作速度仍然比@limited版本慢