首页 > 解决方案 > 对于复杂的计算和聚合,Linq 或 SQL 查询更好吗?

问题描述

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

标签: performancelinqplsqlreportaggregation

解决方案


那么通过 sql 查询 (pl/sql) 或 linq 进行这些分组和计算的代码的性能和可维护性是否更好?

这取决于你的意思via linq。如果您的意思是您将完整的表提取到本地内存,然后使用 linq 语句提取您想要的结果,那么 SQL 语句当然更快。

但是,如果您的意思是使用 Entity Framework 或类似的东西,那么答案并不容易给出。

如果您使用实体框架(或某些克隆),您的表将由IQueryable<...>而不是IEnumerable<...>. 一个IQueryable有一个Expression和一个ProviderExpression表示必须执行的查询。Provider知道哪个系统必须执行查询(通常是数据库管理系统)以及如何与该系统通信。当必须执行查询时,将Provider其翻译Expression成系统知道的语言(通常是类似 SQL 的语言)并执行 SQL 查询是他们的任务。

有两种 IQueryable LINQ 语句:返回IQueryable<...>of 的语句和返回TResult. 返回的IQueryable只会更改Expression. 它们是使用延迟执行的函数。

不返回IQueryable, are ToList(), FirstOrDefault(), Any(), Max()等的函数。在内部,它们将调用将GetEnumerator()(通常通过 foreach)命令的函数Provider来翻译Expression和执行查询。

回到你的问题

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

如果您使用实体框架 (-clone),则Expressions根据框架制造商创建的 SQL 查询非常有效。如果您查看代码,那么有时 SQL 查询并不是最佳查询,尽管您必须是一个非常优秀的 SQL 程序员才能改进大多数查询。

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

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

我的建议

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

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

如果您检测到一些您注意到执行时间过长的查询,您始终可以决定通过执行 SQL 查询而不是使用 LINQ 来绕过实体框架。

如果您已将您的存储库包装DbContext在适当的存储库中,并在其中隐藏用例的实现,则存储库的用户将不会注意到差异。


推荐阅读