1

很奇怪的问题。当我这样调用它时,这个函数随机开始挂起和超时:

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

有人可以强调这两个我之间的区别吗?这使得调试非常困难......

4

2 回答 2

2

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

于 2012-05-10T15:49:43.283 回答
1

您可能会成为参数嗅探的牺牲品。查看表现不佳的执行计划。在计划 XML 中,您将在 ParameterList 标记中看到两个值:不言自明的 ParameterCompiledValue 和 ParameterRuntimeValue。如果两者的数据分布大相径庭,则您可能会为您的运行时价值获得次优计划。您可以尝试在函数中运行缓慢的语句中添加“with (recompile)”,看看是否有帮助

于 2012-05-10T16:10:19.123 回答