【问题标题】:Entity Framework 4 - Stored procedure inordinately slowEntity Framework 4 - 存储过程异常缓慢
【发布时间】:2011-10-27 16:10:34
【问题描述】:

当从 Management Studio 执行时,存储过程在

以下是分析器输出:

有点讽刺,因为创建 SP 的原因是为了提高 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,它的工作原理与没有空格一样好。

【问题讨论】:

    标签: sql-server-2008 entity-framework stored-procedures


    【解决方案1】:

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

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

    已编辑以添加看似解决方案的内容

    另一个想法(从过去的日子开始)参数嗅探通常是导致 SP 运行缓慢的罪魁祸首,该 SP 由开发人员使用错误参数运行,然后设置了糟糕的执行计划。添加 WITH RECOMPILE 选项以根据合适的参数获取新计划将主要解决此问题。另一个作弊是将传入的参数分配给本地 sql 变量(SP 本地),并且只在查询中使用本地变量。

    现在您有了一个不错的执行计划的 SP,您应该能够删除“WITH RECOMPILE”并且它仍然可以工作。我会说参数嗅探问题很少见。

    【讨论】:

    • "EF 总是返回所有行"。不明白你的意思。它返回我期望的行,即。与通过 MSSMS 执行时相同。将更新问题。
    • 我的意思是,如果您将 Linq 查询应用于使用 SP 的实体,那么在应用 Linq 查询之前,所有记录都会从 SP 返回,而直接 EF 会更改它发送到的 SQL DB 依赖于 Linq。我不确定您是否在查询中使用 Linq 来仅获取几条记录,但执行 SP 会带回数千条记录。我希望这很清楚 - 它看起来不像!
    • 我也可以补充一下,或许你可以尝试直接用ADO.Net调用SP,完全断掉EF,看看性能有没有变化。
    • 试过了,性能也一样差。令我印象深刻的是,当从除 MSSMS 之外的任何地方调用时,读取始终为 1994243。从 MSSMS 始终是 4609。
    • 另一个想法(从过去的日子开始)参数嗅探通常是慢速 SP 的罪魁祸首。添加 WITH RECOMPILE 选项以根据合适的参数获取新计划将主要解决此问题。另一个作弊是将传入的参数分配给本地 sql 变量(SP 本地),并且只在查询中使用本地变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    相关资源
    最近更新 更多