1

我发现了一个有趣的问题,即存储过程从实体框架执行得非常慢。我已经解决了这个问题,但我想听听是否有人能告诉我为什么该解决方案有效。

问题

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

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

经过 2 天的实验后快进,我发现如果我简单地将以下内容放在存储过程的开头:DECLARE @date1 DATETIME = @date并改用 @date1,存储过程会在 1 秒内执行,同样来自实体框架。

为什么?

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

4

1 回答 1

1

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

“分配给一个变量并使用该变量禁用参数嗅探。即 SQL Server 不再有一个特定的日期,它可以在统计信息中查找以获取选择性估计,并且只是根据 OPTIMIZE FOR UNKNOWN 进行猜测”

使用OPTIMIZE FOR UNKNOWN确实可以解决问题。

于 2012-09-04T10:42:00.097 回答