7

我正在使用以下查询从实体框架调用存储过程(返回数据)

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

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

有什么改善这种情况的指导吗?我在 SO 上看到过其他帖子,但没有成功

编辑

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

4

2 回答 2

12

我怀疑参数嗅探。

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

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

于 2012-10-03T12:13:44.223 回答
2

请记住,您的.Where(x => x.isActive == true)过滤器不会应用于程序本身。当您处理表时,过滤器被传递给 where 子句并在数据库上执行。在您的情况下,将执行 proc(不带活动子句),完整的结果集将返回给应用程序,然后where将被应用。

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

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

于 2012-10-03T11:41:56.897 回答