Cont()与Where().Count()有时性能差别如此之大!
在今日的工作中,我遇到了一个棘手的问题:管理用户公司列表时,列表加载变得异常缓慢。面对这个问题,我开始深入调查,发现数据虽然相对较多,但仅有四千多条记录,之前运行良好,为何现在如此缓慢呢?
经过思考,我回想起之前在此列表中添加了一个状态字段,用于提示管理员公司产品列表的修改状态。这个字段引起了问题的出现。我开始分析之前是如何编写这个状态字段的。在实体中加入了ContentStatus字段,并在Linq语句的Select实体对象中使用了一段复杂的三元运算表达式。这个表达式在转换到Sql语句时,生成了大量的Case,when,then语句。我认为这些判断增加了查询的复杂性,可能会影响查询性能。
于是,我决定去掉这个三元运算,但运行页面后,速度并没有明显提高。这时,我借助了LinqPad工具,查看生成的Sql语句。原本简单的Count查询,生成的Sql语句却十分复杂。我在SQL Server中直接运行这个语句,发现查询速度依然很慢。
接下来,我尝试了一种新的方法。我使用Where()函数替代了之前的Count()函数生成Sql语句。结果令人惊讶,运行速度提升了一个数量级!在后台列表查询结果中,速度大大提高。为了证明这一点,我提供了项目中的截图作为证据。
从图1可以看到,使用Count()函数查询结果需要35秒。而在图2中,使用Where().Count()查询同样的数据仅需要4秒钟,速度相差近十倍!
为了兼顾取值的便利性,我还是选择加入了三元运算。使用ContentStatus=Product_Maintain.Where(C => CpanyID == pany.ID && C.IsDeleted == 0 && (C.AuditStatus == 0 || C.AuditStatus == 4)).Count()>0?"产品有更新":""这种方式时,结果如何呢?
事实证明,尽管加入了三元运算,但只要合理使用Where()函数进行查询,依然可以保持较高的查询效率。Count()与Where()之间的区别确实存在,合理使用它们可以大大提高查询效率。这次经历让我深刻认识到优化查询语句的重要性,也提醒我在未来的工作中要更加注意性能优化。初次踏入这片编程天地两年的我,发现了一些关于编程中常见查询的有趣现象。我会就两个看似相似的查询方法展开讨论,它们分别使用了`Count()`和`Where().Count()`的方式。从我对这两者的理解和实验中发现,尽管这两种方法在某些情况下看起来几乎是相同的,但它们背后的运行效率可能有着显著的差异。
让我们看看这两种查询方式的基本形式:
第一种是 `Product_Maintain.Count(C => C.IsDeleted == 0 && (C.AuditStatus == 0 || C.AuditStatus == 4))`。这种方式是直接进行计数查询,当条件满足时,会计算满足条件的记录数量。
第二种是 `Product_Maintain.Where(C => C.IsDeleted == 0 && (C.AuditStatus == 0 || C.AuditStatus == 4)).Count()`。这种方式首先会筛选出满足条件的记录,然后再对这些记录进行计数。在表面看来,这两种方式似乎没有什么区别,因为它们都完成了相同的任务:计算满足特定条件的记录数量。在实际应用中,它们的运行效率可能会有所不同。
在我自己的实践中,我发现当我们在查询中涉及到更复杂的操作(例如在筛选的基础上再进行其他操作)时,使用 `Where().Count()` 的方式可能会比直接使用 `Count()` 的方式更快。这是因为 `Where()` 方法首先会筛选出符合条件的记录,然后再进行下一步操作,这样可以减少后续操作的数据量,从而提高效率。而直接使用 `Count()` 的方式则可能需要处理更多的数据,从而可能会降低效率。
我还想分享一些我在LinqPad中的实验经验。我发现,在LinqPad中查询的结果和在Sql Server中执行生成的Sql语句的结果可能会有所不同。这主要是因为LinqPad中的查询可能包含了更多的上下文信息,比如数据的加载和预处理等过程。尽管在LinqPad中的查询可能需要4秒左右的时间,但生成的Sql语句在Sql Server中执行可能只需要不到1秒的时间。这也说明了直接执行生成的Sql语句可能会更高效。
尽管 `Count()` 和 `Where().Count()` 的方式在有些时候看起来相同,但它们在实际应用中的效率可能会有所不同。我们需要根据具体的应用场景和需求来选择最适合的查询方式。希望我的分享能对大家有所帮助,也期待各位的宝贵意见和建议。这是我在园区发表的第一篇首发文章,感谢大家的阅读和支持!
编程语言
- Cont()与Where().Count()有时性能差别如此之大!
- JavaScript数组push方法使用注意事项
- vue轮播图插件vue-awesome-swiper
- thinkphp的CURD和查询方式介绍
- 浅谈jQuery的bind和unbind事件(绑定和解绑事件)
- vue2.0 实现富文本编辑器功能
- 在SQL Server中迁移数据的几种方法
- 基于jQuery实现在线选座之高铁版
- 利用angular.copy取消变量的双向绑定与解析
- vue中如何创建多个ueditor实例教程
- PHP中使用TCPDF生成PDF文档实例
- 正则表达式与HTML5新元素
- JQuery学习总结【二】
- 解决Ajax加载JSon数据中文乱码问题
- 轻松掌握JavaScript策略模式
- Yii 框架使用Gii生成代码操作示例