【问题标题】:Large number of database reads while calling procedure using Entity Framework 4使用 Entity Framework 4 调用过程时进行大量数据库读取
【发布时间】:2015-07-22 15:04:41
【问题描述】:

在我的 asp.net c# 应用程序中,我正在使用实体框架 4.0 调用一个过程,我的问题是在实时站点上我收到超时问题(完成执行需要超过 1 分钟)

但是当我从 management studio (sql server 2012) 调用相同的过程时,它几乎不需要 6 秒(即使在使用 DBCC FREEPROCCACHEDBCC DROPCLEANBUFFERS 之后)。

在排查问题时发现我使用实体框架调用程序时读取次数过多,请看两张截图。

实体框架调用跟踪..

Management Studio 跟踪

我不确定为什么使用 Entity Framework 调用和从 Management Studio 调用相同过程时性能会有如此大的差异。

我想避免WITH RECOMPILE 选项,这是我们得到的几个线程中的答案。

任何人都可以帮助我,这是什么原因以及处理这种情况的理想方法是什么?

【问题讨论】:

    标签: asp.net sql-server performance entity-framework stored-procedures


    【解决方案1】:

    建议with recompile 的原因是它是解决问题的方法之一。这看起来像一个参数嗅探问题,提到的方法是解决它的一种方法。参数嗅探信息:

    http://www.brentozar.com/archive/2013/06/the-elephant-and-the-mouse-or-parameter-sniffing-in-sql-server/

    您可以看到 EF 和 SSMS 之间存在这种差异的原因是,当从 Web(无论是从 EF 还是 ADO 或其他)调用时会自动传入查询选项 - 特别是 ANSI_NULLs 和/或 quoted_identifier .

    缓解参数嗅探的方法来自:

    https://www.mssqltips.com/sqlservertip/3257/different-approaches-to-correct-sql-server-parameter-sniffing/

    1. 使用 WITH RECOMPILE 选项创建 SQL Server 存储过程
    2. 使用 SQL Server 提示选项(重新编译)
    3. 使用 SQL Server 提示选项 (OPTIMIZE FOR)
    4. 在 SQL Server 存储过程中使用虚拟变量
    5. 在实例级别禁用 SQL Server 参数嗅探
    6. 禁用特定 SQL Server 查询的参数嗅探

    7. 我不认为它在上面的文章中列出,但在 2008 年及以上你可以使用optimize for unknown - 与上面列表中的 3 相关,但效果更好(可能)

    【讨论】:

      猜你喜欢
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-25
      • 1970-01-01
      • 2011-07-14
      • 1970-01-01
      • 2011-01-12
      相关资源
      最近更新 更多