使用Entity Framework 4调用过程时大量数据库读取

时间:2015-07-22 15:04:41

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

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

但是当我从管理工作室(sql server 2012)打电话时,相同的程序几乎不需要6秒(即使使用DBCC FREEPROCCACHEDBCC DROPCLEANBUFFERS后)。

当调查问题时,发现当我使用实体框架调用程序时,读取次数很高。请选择两个屏幕截图。

实体框架调用跟踪..

enter image description here

Management Studio Trace enter image description here

我不确定为什么在使用Entity Framework进行调用时以及从Management studio调用相同的过程时,性能会有太大差异。

我想避免使用WITH RECOMPILE选项,这是我们得到的几个主题的答案。

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

1 个答案:

答案 0 :(得分: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和/或{ {1}}。

减轻参数嗅探的方法取自:

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

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

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