我发现了一个有趣的问题,即存储过程从实体框架执行得非常慢。我已经解决了这个问题,但我想听听是否有人能告诉我为什么该解决方案有效。
问题
我有一个接收DATETIME类型的@date参数的存储过程GetLoginCount。当我直接在数据库上执行此存储过程时,它会在一秒钟内执行。通过我的应用程序通过Entity Framework执行时,大约需要 45 秒。
我尝试在存储过程上使用 WITH RECOMPILE 并清除服务器上的执行计划,以确保它没有缓存一些未使用正确索引的执行计划的慢版本。
经过 2 天的实验后快进,我发现如果我简单地将以下内容放在存储过程的开头:DECLARE @date1 DATETIME = @date
并改用 @date1,存储过程会在 1 秒内执行,同样来自实体框架。
为什么?
我已经解决了我的问题,一切都很好,但我需要知道为什么这个特定的解决方案有效。