参数化SQL和NULL运行缓慢

g.f*_*ley 2 sql t-sql sql-server sql-server-profiler

我正在从.net调用一些参数化的sql.我不确定为什么但是当检查参数是否为NULL时,sql运行速度非常慢,而不包括:

所以这:

exec sp_executesql N'
 SELECT [id]
 FROM [tblAddress] (nolock)
 WHERE 1 = 1
 AND ([id] = @id OR @id  IS NULL)

',N'@id int',
@id=4395
Run Code Online (Sandbox Code Playgroud)

然后运行得更快:

exec sp_executesql N'
 SELECT [id]
 FROM [tblAddress] (nolock)
 WHERE 1 = 1
 AND ([id] = @id)

',N'@id int',
@id=4395
Run Code Online (Sandbox Code Playgroud)

运行SQL事件探查器超过100万行的最高查询的持续时间为175,其读取为3720,但第二个查询的持续时间为1,只有3个读取.

为什么会有这样的差异?如何改进呢?

gbn*_*gbn 5

OR子句不是SARGABLE所以使用的计划有扫描,而不是像第二个那样的搜索

试试这个:2寻求

SELECT [id]
 FROM [tblAddress]
 WHERE [id] = @id
UNION ALL
SELECT [id]
 FROM [tblAddress] 
 WHERE @id IS NULL)
Run Code Online (Sandbox Code Playgroud)

注意:您不需要NOLOCK提示.要么1=1