存储过程是缓慢的实体从实体框架框架
我调用存储过程(即返回数据)使用以下存储过程是缓慢的实体从实体框架框架
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
我怀疑参数嗅探。
尝试在你的程序中应用反参数嗅探代码。 (在使用它们之前将参数分配给局部变量)。
http://blogs.technet.com/b/mdegre/archive/2012/03/19/what-is-parameter-sniffing.aspx
或者当OP使用2008时,他们可以使用'OPTIMIZE FOR UNKNOWN',它不那么冗长,稍强一些(如果语句需要重新编译,变量仍然可以被嗅探) –
这很棒。解决了这个问题 – Tassadaque
记住,你的.Where(x => x.isActive == true)
过滤器不应用到程序本身。在处理表时,过滤器将传递给where子句并在数据库中执行。在你的情况下,proc将被执行(没有活动条款),完整的结果集将被返回到应用程序,之后将应用where
。
我知道你说proc更快,但你确定你不是以某种方式将isActive = true作为参数传递给它吗?
我看到你已经有了这个过程的参数,所以也许如果你添加状态作为另一个参数,并在查询级别应用它,它会提高你的性能。
它会返回多少行? –
有两个主要表涉及一个有33K和其他有48K行。在结果中,我有134名员工在分组后出售。我还在外键列中添加了索引 – Tassadaque
如果我直接执行过程,则需要3秒。但正如我从实体框架称它需要很长时间 – Tassadaque