performance - 对于复杂的计算和聚合,Linq 或 SQL 查询更好吗?
问题描述
我们必须在运行时(asp.net mvc)从具有数百万条记录的 Oracle 表数据中创建并显示一些复杂的报告。报告数据必须从分组和很少复杂的计算中获得。那么通过 sql 查询 (pl/sql) 或 linq 进行这些分组和计算的代码的性能和可维护性是否更好?谢谢你的kindle回复
解决方案
那么通过 sql 查询 (pl/sql) 或 linq 进行这些分组和计算的代码的性能和可维护性是否更好?
这取决于你的意思via linq
。如果您的意思是您将完整的表提取到本地内存,然后使用 linq 语句提取您想要的结果,那么 SQL 语句当然更快。
但是,如果您的意思是使用 Entity Framework 或类似的东西,那么答案并不容易给出。
如果您使用实体框架(或某些克隆),您的表将由IQueryable<...>
而不是IEnumerable<...>
. 一个IQueryable
有一个Expression
和一个Provider
。Expression
表示必须执行的查询。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
在适当的存储库中,并在其中隐藏用例的实现,则存储库的用户将不会注意到差异。
推荐阅读
- ruby-on-rails - 导轨中的三重嵌套模型形式显示错误
- azure-functions - 从 Azure 函数创建 csv 并上传网络文件夹
- android - 调用 setMeasuredDimension 后使用 width 和 height 参数是否正确?
- python - 通过Python中的多线程填充父进程中的数组
- python - 我可以删除列表变量中的一些值吗?或者有更好的解决方案吗?
- javascript - 在期望断言中使用等待异步时,TestCafe 卡住了
- cplex - 如果不是excel矩阵中的所有单元格都填充了数字,如何将excel导入Cplex?
- android - 在设备上运行应用程序开始时没有默认设置和参数
- php - 验证记录的另一列的值在值数组中的值
- ffmpeg - 连接 2 个迷你音频文件并循环播放并添加背景音乐