非常奇怪的问题。当我这样称呼它时,这个函数已经随机开始挂起和超时:
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
有人可以突出这两个我之间的区别吗?它正在努力调试......
答案 0 :(得分:2)
变量可以是空值,而静态值肯定不是。这可能导致不同的执行计划。
答案 1 :(得分:1)
你可能成为参数嗅探的牺牲品。看一下表现不佳的执行计划。在计划XML中,您将在ParameterList标记中看到两个值:ParameterCompiledValue和ParameterRuntimeValue,这些值是不言自明的。如果两者的数据分布完全不同,您可能会获得运行时值的次优计划。您可以尝试在函数中运行缓慢的语句中添加“with(重新编译)”,看看是否有帮助