存储过程和实体框架性能(Performance of stored procedures & Ent

2019-07-29 01:22发布

在什么情况通过我的实体模型调用存储过程会导致慢得多的性能比调用它direcly任何明显的原因是什么?

首先,我不指望SP以完全相同的速度运行,我知道,有各种各样的事情,英孚已经这样做就不叫直接访问SP时。

这且不说,我有一个返回一个字符串的三列的查询。 它运行非常迅速,当我通过企业管理执行它。 如果我通过EF运行它,然后它需要约六秒钟。 诚然,结果被映射成一个复杂的类型,但是当我通过SQL Server事件探查器运行查询很明显地看到,延迟发生在SQL服务器上:

在图中,1表示SQL正在从企业管理器叫,2表示它正在通过使用EF我的应用程序调用。

有什么明显的,我做错了什么? 我所期待的,也许一两秒钟的延迟,但差异显得有些力不从心。

编辑:

看来,当通过ADO.Net调用的存储过程也运行速度慢。 我的同事似乎认为它的东西做与.NET是缓存错误的执行计划。 通过编辑存储过程,并重新保存它似乎清除无论是在两者的快取和ADO.Net和EF调用存储过程的工作做好。

有没有其他人遇到这样的事情之前?

Answer 1:

看看这个线程上的SQL Server论坛 。 这是一个有点相似,并可能提供一些线索。 总之,你可以在SSMS和ADO.NET不同的SQL Server运行环境的选择导致不同的执行计划。 清除SQL Server的计划缓存应该有所帮助。



Answer 2:

帕维尔加季洛夫似乎击中头部与ARITH放弃设定的名字,但我想我会发布更多一点关于我的发现。

这篇文章对SO涵盖了变通的讨论类似的问题; 它可能写的EF连接和SQL.Data.Client该前缀与“SET ARITHABORT ON”的DB的呼叫之间的包装类。 这篇文章在MSDN上详细介绍了。

说完看了看变化的复杂性,并考虑到我们要的应用程序使用,以充分利用存储过程EF我们要硬着头皮移动SP功能集成到我们的EF数据模型,而不是移动。



Answer 3:

是不是在一个单一的交易相同的调用

INSERT INTO foo (col1, col2) SELECT col1, col2 (with all 100 rows of the changes)

不是调用100次

EXEC SP_foo_INSERT param1, param2

只要看看在这两种情况下生成的查询偷看,并直接在数据库测试查询。 看看有什么是它的执行计划。



文章来源: Performance of stored procedures & Entity Framework