存储过程是缓慢的实体从实体框架框架

问题描述:

我调用存储过程(即返回数据)使用以下存储过程是缓慢的实体从实体框架框架

from sp in db.GetSale(bID, SID,m,y).Where(x => x.isActive == true) 
select sp 

查询如果我直接运行这个程序,只需要2秒,但是当我通过EF调用这个存储过程,它需要10到15秒。

任何指导改善情况?我在这里就没有见过这样的其他职位,但都没有成功

编辑

这里是sqlplan我的程序 https://skydrive.live.com/redir?resid=87DCBD5D3E9AAA57!374

+0

它会返回多少行? –

+0

有两个主要表涉及一个有33K和其他有48K行。在结果中,我有134名员工在分组后出售。我还在外键列中添加了索引 – Tassadaque

+0

如果我直接执行过程,则需要3秒。但正如我从实体框架称它需要很长时间 – Tassadaque

我怀疑参数嗅探。

尝试在你的程序中应用反参数嗅探代码。 (在使用它们之前将参数分配给局部变量)。

http://blogs.technet.com/b/mdegre/archive/2012/03/19/what-is-parameter-sniffing.aspx

+0

或者当OP使用2008时,他们可以使用'OPTIMIZE FOR UNKNOWN',它不那么冗长,稍强一些(如果语句需要重新编译,变量仍然可以被嗅探) –

+0

这很棒。解决了这个问题 – Tassadaque

记住,你的.Where(x => x.isActive == true)过滤器不应用到程序本身。在处理表时,过滤器将传递给where子句并在数据库中执行。在你的情况下,proc将被执行(没有活动条款),完整的结果集将被返回到应用程序,之后将应用where

我知道你说proc更快,但你确定你不是以某种方式将isActive = true作为参数传递给它吗?

我看到你已经有了这个过程的参数,所以也许如果你添加状态作为另一个参数,并在查询级别应用它,它会提高你的性能。