我们可以使用实体框架来调用占用大量CPU的查询吗?

时间:2018-09-10 09:43:52

标签: .net entity-framework stored-procedures ado.net

如果要在数据库中编写非常消耗资源的SQL查询以获取数据。是否建议使用实体框架通过存储过程调用来获取数据,还是应该坚持使用ADO.NET

2 个答案:

答案 0 :(得分:1)

SQL脚本是一个SQL脚本,无论是由谁编写或生成的。如果用最佳代码实现存储过程,则它将运行良好。如果您的脚本中有不必要的浪费操作,那么它将不能很好地执行。如果脚本是使用Entity Framework生成的,并且运行良好,那么按原样使用它就不会有问题。如果效果不佳,那么要获得良好的性能,就需要一个存储过程。

当您怀疑由Entity Framework生成的脚本是否运行良好时,则需要执行以下步骤:

  • 找出要执行的算法的复杂性
  • 创建一些测试用例,并根据复杂度,找出预期的计算时间
  • 如果计算时间比预期时间短,那么您将需要找出为什么您的期望与启发式实验所经历的现实相比是悲观的
  • 否则,如果计算时间较长,则尝试在存储过程中自己实现相同的事情并比较性能
  • 如果计算时间在预期时间附近,那么您不需要做任何事情,因为EF已经完成了任务

我已经很长时间没有使用.NET和EF了,但是据我所记得,在许多情况下,它倾向于一个接一个地收集记录,即使它们可以对每个记录执行单独的查询通过单个查询来收集,这大大增加了复杂性。

因此,简而言之,EF在许多情况下都表现良好,但是,如果您遇到速度慢的情况,则如上所述,您需要找出其原因。您将要检查生成的脚本,以查看当单个脚本可能已返回所有n个所需记录时,是否编写n个脚本来获取n条记录。在这里,您可以看到收集生成的查询的方式:How do I view the SQL generated by the Entity Framework?

答案 1 :(得分:0)

EntityFramework / EntityClientDataProvider的主要职责是将LINQ-to-Entities或Entity SQL查询转换为基础数据库可以理解的SQL查询。它与ADO.Net数据提供程序通信,后者再从数据库发送或检索数据。最后,它使用ADO.Net数据提供程序通过标准ADO.Net与数据库进行通信

因此,您的问题的答案是:计算功耗不会改变。

看看EF体系结构图。 EF Overview