实体框架4 - 存储过程极其缓慢

6

当在管理工具中执行存储过程时,它完成时间不到0.1秒,但是通过EF执行时需要超过2秒。

以下是分析器输出:

Profiler output

有点讽刺的是,创建该存储过程的原因是为了提高EF查询性能,因为该查询需要大约1.2秒。

更新 值得一提的是,SP结果映射到一个EF复杂类型。我没有使用任何玄学操作进行调用:

var menuTags = db.GetMenuTags(2, "en-US");

EF生成的SQL语句是:
exec [dbo].[GetMenuTags] @CustTypeId=2,@LanguageId='en-US                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           '

唯一的区别是EF在@LanguageId的末尾添加了一堆空格,但这不会影响性能。我已经在MSSMS中尝试了完全相同的SQL语句,与没有空格时的表现一样好。
1个回答

5

通过EF执行的SP总是返回所有行,这可能会导致延迟。

也许发布您的SP和原始EF生成的SQL将有所帮助。

编辑以添加似乎是解决方案的内容

另一个想法(来自过去的日子)是参数嗅探经常是缓慢SP的罪魁祸首,因为开发人员使用了糟糕的参数运行了SP,然后设置了低劣的执行计划。 添加WITH RECOMPILE选项以基于良好参数获取新计划将大部分解决此问题。 另一个诈骗方法是将传入的参数分配到本地sql变量(局部SP)中,并仅在查询中使用本地变量。

现在你有了一个良好的执行计划的SP,你应该能够删除“WITH RECOMPILE”,它仍将工作。 参数嗅探问题很少见。


"EF总是返回所有行"。不确定你的意思。它返回我期望的行,即与通过MSSMS执行时相同。 - Malako
我的意思是,如果您将Linq查询应用于使用SP的实体,则在应用Linq查询之前,将从SP返回所有记录,而直接EF会根据Linq更改发送到DB的SQL。我不确定您是否正在使用Linq查询来获取仅几条记录,但执行SP将带回数千条记录。我希望这很清楚 - 它看起来并不像! - K. Bob
2
另一个过去的想法:参数嗅探经常是慢存储过程的罪魁祸首,由于开发人员使用了错误的参数并设置了糟糕的执行计划。添加WITH RECOMPILE选项,基于良好的参数获得新计划,这将大多解决这个问题。另一种方法是将传入的参数分配到本地SQL变量(SP本地变量),并在查询中只使用本地变量。 - K. Bob
非常抱歉打扰,但是我非常感谢你!我的一个存储过程在代码中被调用时需要几个小时才能完成。现在只需要约200毫秒就能完成了。 - fero
@fero 没问题。很高兴能帮到其他人。 - K. Bob
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接