我发现了一个有趣的问题,即存储过程从Entity Framework执行得非常慢。我已经解决了这个问题,但我想知道是否有人可以告诉我为什么解决方案有效。
问题
我有一个存储过程 GetLoginCount ,它接收类型为 DATETIME 的 @date 参数。当我直接在数据库上执行此存储过程时,它会在一秒钟内执行。通过我的应用程序通过实体框架执行时,大约需要45秒。
我尝试在存储过程中使用WITH RECOMPILE并清除服务器上的执行计划,以确保它没有缓存一些没有使用正确索引的执行计划的慢速版本。
经过2天的实验后快进,我发现如果我只是将以下内容放在我的存储过程的开头:DECLARE @date1 DATETIME = @date
并使用@ date1代替,则存储过程执行在1秒内,也来自实体框架。
WHY吗
我已经解决了我的问题,这一切都很好,但我需要知道为什么这个特定的解决方案有效。
答案 0 :(得分:1)
Martin Smith在评论中给出了正确答案,但由于他没有把它作为答案,我将其插入此处,因此我可以正确地将问题标记为已回答:
“分配给变量并使用变量禁用参数嗅探。即SQL Server不再具有特定日期,它可以在统计中查找以获得选择性估计值,并根据OPTIMIZE FOR UNKNOWN进行猜测”
使用 OPTIMIZE FOR UNKNOWN 确实解决了这个问题。