>我使用以下查询从实体框架调用存储过程(返回数据)
from sp in db.GetSale(bID, SID,m,y).Where(x => x.isActive == true)
select sp
如果我直接运行此过程,则只需 2 秒,但当我通过 EF 调用此存储过程时,则需要 10 到 15 秒。
有什么改善情况的指导吗?我在SO上看到了其他帖子,但没有成功
编辑
这是我的程序的sqlplanhttps://skydrive.live.com/redir?resid=87DCBD5D3E9AAA57!374
我怀疑参数嗅探。
尝试在过程中应用反参数探查代码。(在使用参数之前将参数分配给局部变量)。
http://blogs.technet.com/b/mdegre/archive/2012/03/19/what-is-parameter-sniffing.aspx
请记住,.Where(x => x.isActive == true)
筛选器不会应用于过程本身。处理表时,筛选器将传递给 where 子句并在数据库上执行。在您的情况下,将执行 proc(没有活动子句),完整的结果集将返回给应用程序,然后应用where
。
我知道你说proc更快,但是你确定你没有以某种方式将isActive=true作为参数传递给它吗?
我看到您已经在此过程中拥有参数,因此,如果您将status添加为另一个参数并将其应用于查询级别,它将提高您的性能。