• 2023年6月21日

sql server参数空值判断 len/isnull/is not null/is null

存储过程中,对传入参数进行空值判断,经测试10次每次100万次isnull(@par,”)=”、@par is null、@par is not null 判断取平均值,结果如下:

测试代码如下:



declare @loop int = 1000000
,@par nvarchar(20) = null
,@startTime datetime = getdate()
,@subTime int=0
,@times int =10

while @times>0
begin
    set @loop  = 1000000 
    set @startTime=getdate()
	while @loop>0
	begin
	  if isnull(@par,'')=''
		set @loop = @loop -1
	end
	set @times = @times -1 
	set @subTime = @subTime + datediff(MILLISECOND,@startTime,getdate())
end

select @subTime / 10

set @times=10
set @subTime=0

while @times>0
begin
set @loop  = 1000000 
set @startTime   = getdate() 

while @loop>0
begin
  if  @par is null
    set @loop = @loop -1
end
    set @times = @times -1 
	set @subTime = @subTime + datediff(MILLISECOND,@startTime,getdate())
end
select @subTime / 10


set @times=10
set @subTime=0
while @times>0
begin
set @loop  = 1000000 
set @startTime   = getdate() 
while @loop>0
begin
  if len(@par)>0
    set @loop = @loop -1
	else
    set @loop = @loop -1
end
set @times = @times -1 
	set @subTime = @subTime + datediff(MILLISECOND,@startTime,getdate())
end
select @subTime / 10

本次测试是对传入参数null值判断效率,不代表sql语句中的判断效率。

在where条件中进行参数空判断,结果如下

测试代码如下:



declare @loop int = 1000
,@par nvarchar(20) = null
,@startTime datetime = getdate()
,@subTime int=0
,@times int =1

while @times>0
begin
    set @loop  = 100
    set @startTime=getdate()
	while @loop>0
	begin
	  if (select count(1) from lot where (isnull(@par,'')='' or lotid=@par))>0
		set @loop = @loop -1
	end
	set @times = @times -1 
	set @subTime = @subTime + datediff(MILLISECOND,@startTime,getdate())
end

select @subTime / 1

set @times=1
set @subTime=0

while @times>0
begin
set @loop  = 100
set @startTime   = getdate() 

while @loop>0
begin
  if   (select count(1) from lot where @par is null or lotid=@par  )>0
    set @loop = @loop -1
end
    set @times = @times -1 
	set @subTime = @subTime + datediff(MILLISECOND,@startTime,getdate())
end
select @subTime / 1


set @times=1
set @subTime=0
while @times>0
begin
set @loop  = 100
set @startTime   = getdate() 
while @loop>0
begin
  if  (select count(1) from lot where len(@par) >0 or lotid=@par  )>0
    set @loop = @loop -1
	else
    set @loop = @loop -1
end
set @times = @times -1 
	set @subTime = @subTime + datediff(MILLISECOND,@startTime,getdate())
end
select @subTime / 1

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注