MSSQL NVARCHAR(MAX)作为过程参数和变量声明的缺点

时间:2014-08-06 08:35:21

标签: sql sql-server parameter-passing nvarchar variable-declaration

这里的问题很简单但是我搜索了很多,但我还没有在互联网上找到答案..

在过程参数和变量声明中使用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)之间是否存在任何性能差异?

1 个答案:

答案 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版本慢