由于日期参数,存储过程因实体框架而变慢

时间:2012-06-21 09:11:27

标签: sql-server-2008 entity-framework

我发现了一个有趣的问题,即存储过程从Entity Framework执行得非常慢。我已经解决了这个问题,但我想知道是否有人可以告诉我为什么解决方案有效。

问题

我有一个存储过程 GetLoginCount ,它接收类型为 DATETIME @date 参数。当我直接在数据库上执行此存储过程时,它会在一秒钟内执行。通过我的应用程序通过实体框架执行时,大约需要45秒。

我尝试在存储过程中使用WITH RECOMPILE并清除服务器上的执行计划,以确保它没有缓存一些没有使用正确索引的执行计划的慢速版本。

经过2天的实验后快进,我发现如果我只是将以下内容放在我的存储过程的开头:DECLARE @date1 DATETIME = @date并使用@ date1代替,则存储过程执行在1秒内,也来自实体框架。

WHY吗

我已经解决了我的问题,这一切都很好,但我需要知道为什么这个特定的解决方案有效。

1 个答案:

答案 0 :(得分:1)

Martin Smith在评论中给出了正确答案,但由于他没有把它作为答案,我将其插入此处,因此我可以正确地将问题标记为已回答:

“分配给变量并使用变量禁用参数嗅探。即SQL Server不再具有特定日期,它可以在统计中查找以获得选择性估计值,并根据OPTIMIZE FOR UNKNOWN进行猜测”

使用 OPTIMIZE FOR UNKNOWN 确实解决了这个问题。