函数挂在@Variable输入上,但不是硬编码整数

时间:2012-05-10 15:47:54

标签: sql-server tsql

非常奇怪的问题。当我这样称呼它时,这个函数已经随机开始挂起和超时:

DECLARE @persId int 
SET @persId = 336

SELECT  * FROM  [CIDER].[dbo].[SMAN_ACL_getPermissions]   (
  null
  ,@persId
  ,1
  ,null)
GO

但是当我这样称呼它时,回复速度非常快:

SELECT  * FROM  [CIDER].[dbo].[SMAN_ACL_getPermissions]   (
  null
  ,336
  ,1
  ,null)
GO

有人可以突出这两个我之间的区别吗?它正在努力调试......

2 个答案:

答案 0 :(得分:2)

变量可以是空值,而静态值肯定不是。这可能导致不同的执行计划。

答案 1 :(得分:1)

你可能成为参数嗅探的牺牲品。看一下表现不佳的执行计划。在计划XML中,您将在ParameterList标记中看到两个值:ParameterCompiledValue和ParameterRuntimeValue,这些值是不言自明的。如果两者的数据分布完全不同,您可能会获得运行时值的次优计划。您可以尝试在函数中运行缓慢的语句中添加“with(重新编译)”,看看是否有帮助