Performance 对于复杂的计算和聚合,Linq或SQL查询更好吗?

Performance 对于复杂的计算和聚合,Linq或SQL查询更好吗?,performance,linq,plsql,report,aggregation,Performance,Linq,Plsql,Report,Aggregation,我们必须在运行时(asp.net mvc)创建并显示一些来自Oracle表的复杂报告,这些表包含数百万条记录。报告数据必须通过分组和少量复杂计算获得。 那么,通过sql查询(pl/sql)或linq进行这些分组和计算的代码的性能和可维护性更好吗? 谢谢你的kindle回复 那么,这样做的代码的性能和可维护性是否更好呢 这些分组和计算是通过sql查询(pl/sql)还是通过linq 这取决于您通过linq所说的是什么意思。如果您的意思是将整个表提取到本地内存,然后使用linq语句提取所需的结果,那

我们必须在运行时(asp.net mvc)创建并显示一些来自Oracle表的复杂报告,这些表包含数百万条记录。报告数据必须通过分组和少量复杂计算获得。 那么,通过sql查询(pl/sql)或linq进行这些分组和计算的代码的性能和可维护性更好吗? 谢谢你的kindle回复

那么,这样做的代码的性能和可维护性是否更好呢 这些分组和计算是通过sql查询(pl/sql)还是通过linq

这取决于您通过linq所说的
是什么意思。如果您的意思是将整个表提取到本地内存,然后使用linq语句提取所需的结果,那么SQL语句当然会更快

然而,如果您的意思是使用实体框架或类似的东西,那么答案就不容易给出了

如果使用实体框架(或某些克隆),表将由
IQueryable
表示,而不是
inumerable
IQueryable
具有
表达式和
提供程序。
表达式
表示必须执行的查询。
提供者
知道哪个系统必须执行查询(通常是数据库管理系统)以及如何与该系统通信。当必须执行查询时,
提供者的任务是将
表达式
翻译成系统知道的语言(通常类似SQL)并执行SQL查询

有两种类型的IQueryable LINQ语句:返回某物的
IQueryable
,以及返回
TResult
。返回
IQueryable
的函数只会更改
表达式
。它们是使用延迟执行的函数

不返回
IQueryable
的函数有
ToList()
FirstOrDefault()
Any()
Max()
,等等。它们会在内部调用将
GetEnumerator()
的函数(通常通过foreach),它命令
提供程序
翻译
表达式
并执行查询

回到你的问题

那么,实体框架和SQL哪一个更有效呢?效率不仅是执行查询的时间,也是软件第一个版本和未来更改的开发/测试时间

如果使用实体框架(-clone),则根据框架制造商的不同,从
表达式创建的SQL查询效率相当高。如果您查看代码,那么有时SQL查询不是最佳查询,尽管您必须是一个相当好的SQL程序员才能改进大多数查询

在SQL语句之上使用实体框架和LINQ查询的最大优势是开发时间更短。LINQ语句的语法在编译时检查,SQL语句在运行时检查。开发和测试周期将更短

重用LINQ语句很容易,而SQL语句几乎总是必须编写的,特别是对于要执行的查询。LINQ语句可以在不使用数据库的情况下对表示表的任何项目序列进行测试

我的建议

对于大多数查询,您不会注意到实体框架查询和SQL查询在执行时间上有任何差异

如果您期望复杂的查询和将来的更改,我会选择实体框架。主要论点是开发时间越短,测试的可能性越大,可维护性越好

如果您检测到一些查询,发现执行时间太长,那么您可以通过执行SQL查询而不是使用LINQ来决定绕过实体框架


如果您已经将
DbContext
包装到了一个合适的存储库中,在那里您对用例的实现进行了隐藏,那么存储库的用户不会注意到其中的差异。

这个问题有点过于宽泛。通常情况下,我会说数据库在这些计算方面速度更快,但这实际上取决于您的具体需求、数据、硬件等……而将可维护性与性能(这当然意味着速度,而不是内存)进行权衡会使其更为广泛。所以我能给出的最好的建议是:我同意这个问题太宽泛了。但出于考虑,随着事情变得越来越复杂,人们更容易产生糟糕的linq,因为你对幕后生成的脚本的控制越来越少;一个错误的映射可能会在整个网络中引入一个完整的表,只是为了过滤几个记录(同样,在某些情况下,这是预期的行为)。另外,如果您的公司有很多DBA,但只有一个编码员,那么最好将所有内容卸载到存储过程中:)我要强调一下:就代码的可理解性而言,linq可能更易于阅读和理解。其次,如果将来数据库实现发生变化,您不必检查所有SQL以确保它在新的数据库实现中工作。您只需确保linq查询的性能即可。