浅析EF性能优化

1.       数据Load

延迟加载:当实体第一次读取时,相关数据没有加载;当第一次试图访问导航属性时,所需的导航数据自动加载,EF默认使用这种方式加载数据,尽量使用预先加载和显示加载。

优点:加载数据快

缺点:数据库交互多次

预先加载:当读取实体时,相关数据同时读取。这通常会导致一个连接查询,查询所有所需的数据,使用Include方法指定预先加载。

优点: 数据库交互少

缺点:加载实体多,数据量大时,变慢,会有很多冗余字段

显示加载:这种加载方式类似于延迟加载,不同的是我们要在代码中明确地查询相关数据,导航属性是手动控制的,需要调用Collection.Load方法获取集合,调用Reference.Load方法获取单个实体来加载相关数据。

优点: 加载数据快,导航属性如何加载可以自己控制,通常关联实体集合的数量被限制时,使用Load方法

缺点: 需要自己控制,数据库交互多次,交互次数由自己控制

CompiledQuery提供对查询的编译和缓存以供重新使用。当相同的查询需要执行很多遍的时候,那么我们可以使用ComplieQuery将查询的语句进行编译以便下次使用,这样可以免去对同一语句的多次处理,从而改善性能

优点:减少查询表达式树编译次数

AsNoTracking如果数据是只读操作,用AsNoTracking取消追踪,提升性能。

SqlQuery对于复杂的查询或存储过程的使用,考虑用SqlQuery操作原生sql。

Skip分页在数据库中分页,不要再内存中分页,以提升性能

IQueryableIEnumerableIQueryable返回的是查询表达式,也就是说生成了SQL查询语句但是却还没有与数据库进行交互。IEnumerable则是已经执行查询数据库的操作且数据保存在了内存中,所以在进行条件拼接的时候一定要在IQueryable类型后面追加Where条件语句,而不是等到ToList之后再开始写条件,以提升性能。

2.       数据Get

Find()方法:查找一个实体,不仅查询数据库,而且还查询新添加的没有保存到数据库中的对象。

查找方式:内存查找->新添加还没保存到数据库中的对象->数据库中还没加载到内存中实体

优点:根据主键查找,主键有索引,速度快

缺点:只能根据主键查找

GetObjectByKey()方法:查找一个实体

查找方式:内存查找- >数据库中实体

优点:先从内存中取速度快

缺点:只能根据主键查找,查询不到抛出异常

TryGetObjectByKey()方法:查找一个实体

查找方式:内存查找- >数据库中实体

优点:先从内存中取速度快 , 查询不到返回null

缺点:只能根据主键查找

Single()方法:查找一个实体

查找方式:数据库中实体

优点:不根据主键进行查询或查询时加载相关实体

缺点:查询没有返回结果或返回的结果多于一个就会抛出异常

SingleOrDefault()方法:查找一个实体

查找方式:数据库中实体

优点:不根据主键进行查询或查询时加载相关实体, 查询没有返回结果返回null

缺点:返回的结果多于一个就会抛出异常

First()方法:查找一个实体,不关心是否有多个结果,仅仅取得第一条

查找方式:数据库中实体

优点:不根据主键进行查询或查询时加载相关实体, 只取第一条

缺点:查询没有结果就会抛出异常

FirstOrDefault()方法:查找一个实体,不关心是否有多个结果,仅仅取得第一条

查找方式:数据库中实体

优点:不根据主键进行查询或查询时加载相关实体, 只取第一条,查询没有结果返回null

缺点:不知道是否有多条数据

3.       其它优化

事物的简短性:尽量把查询语句和影响事物的语句放在事物外面执行,防止资源死锁。

批量修改:尽量用sql执行

预生成视图:在实体框架可以针对概念模型执行查询或将更改保存到数据源之前,它必须生成一组本地查询视图才能访问数据库。 由于生成这些视图会产生很高的成本,因此,您可以在设计时预生成视图并将它们添加到项目。预生成视图方式参考:

https://msdn.microsoft.com/zh-cn/library/bb896240.aspx

AsEnumerable()ToList()两者都是延迟执行sql,区别是AsEnumerable()在执行过滤之前,先将所有数据放到内存中,再进行筛选;ToList()则是先拼接成sql再请求数据库,然后结果放入内存,是真正的筛选数据。

IQueryableIEnumberableIQueryable实现了IEnumberable接口,IEnumerable<T> 泛型类在调用自己的SKip 和 Take 等扩展方法之前数据就已经加载在本地内存里了,IEnumerable跑的是Linq to Object,强制从数据库中读取所有数据到内存先,

而IQueryable<T> 是将Skip ,take 这些方法表达式翻译成T-SQL语句之后再向SQL服务器发送命令,它并不是把所有数据都加载到内存里来才进行条件过滤。

备注:以上内容仅供参考,是EF性能优化很浅的一部分,如有错误大家可以一起讨论。

更多优化请参考:https://msdn.microsoft.com/zh-cn/library/cc853327.aspx

浅析Entity FrameWork性能优化的更多相关文章

  1. [转载] - Entity Framework 性能优化建议

    1.对象管理机制-复杂为更好的管理模型对象,EF提供了一套内部管理机制和跟踪对象的状态,保存对象一致性,使用方便,但是性能有所降低. 2.执行机制-高度封装在EF中,所有的查询表达式都会经过语法分析. ...

  2. Entity Framework性能优化

    AsNonUnicode 执行如下语句,并用SqlProfiler监控其SQL: var list = WMFactory.ReChargeMobile.Queryable().Where(w =&g ...

  3. 浅谈.NET Micro Framework性能优化 转自 软件中国

    .NET Micro Framework的可剪裁性,高定执行,和天生对硬件高集成度都让它的前途一片光明.当然,它现在还很年轻,就发布的SDK v3.0来看,它还有很长的路要走. 废话不说,就这几个月我 ...

  4. 浅析Entity Framework Core中的并发处理

    前言 Entity Framework Core 2.0更新也已经有一段时间了,园子里也有不少的文章.. 本文主要是浅析一下Entity Framework Core的并发处理方式. 1.常见的并发处 ...

  5. 浅析Entity Framework Core2.0的日志记录与动态查询条件

    前言 Entity Framework Core 2.0更新也已经有一段时间了,园子里也有不少的文章.. 本文主要是浅析一下Entity Framework Core2.0的日志记录与动态查询条件 去 ...

  6. 提高entity framework 性能,要注意哪些事情.

    转自:http://www.cnblogs.com/jake1/archive/2013/04/25/3043664.html 我发现现在有不少博友,都反对使用EF框架,说它性能低.其实只要你用的好, ...

  7. Entity Framework性能影响因素分析

    1.对象管理机制-复杂为更好的管理模型对象,EF提供了一套内部管理机制和跟踪对象的状态,保存对象一致性,使用方便,但是性能有所降低. 2.执行机制-高度封装在EF中,所有的查询表达式都会经过语法分析. ...

  8. 《浅析Entity Framework Core中的并发处理》引起的思考

    看到一篇关于EF并发处理的文章,http://www.cnblogs.com/GuZhenYin/p/7761352.html,突然觉得为什么常见业务中为什么很少做并发方面的考虑.结合过去的项目,这样 ...

  9. Code First Entity Framework 6化被动为主动之explicit loading模式实战分析( 附源码)

    在使用Entity Framework加载关联实体时,可以有三种方式: 1.懒加载(lazy Loading); 2.贪婪加载(eager loading); 3.显示加载(explicit load ...

随机推荐

  1. Hadoop基础-MapReduce的数据倾斜解决方案

    Hadoop基础-MapReduce的数据倾斜解决方案 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据倾斜简介 1>.什么是数据倾斜 答:大量数据涌入到某一节点,导致 ...

  2. Spark记录-spark介绍

    Apache Spark是一个集群计算设计的快速计算.它是建立在Hadoop MapReduce之上,它扩展了 MapReduce 模式,有效地使用更多类型的计算,其中包括交互式查询和流处理.这是一个 ...

  3. javascript实现的拖拽回放

    这个功能很简单,直接贴代码啊: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "ht ...

  4. 【LibreOJ】#6354. 「CodePlus 2018 4 月赛」最短路 异或优化建图+Dijkstra

    [题目]#6354. 「CodePlus 2018 4 月赛」最短路 [题意]给定n个点,m条带权有向边,任意两个点i和j还可以花费(i xor j)*C到达(C是给定的常数),求A到B的最短距离.\ ...

  5. Spring Boot实战系列-----------邮件发送

    快速导航 添加Maven依赖 配置文件增加邮箱相关配置 Service.Test项目代码构建 五种邮件发送类型讲解 文本邮件 html邮件 附件邮件 html内嵌图片邮件 模板邮件 问题汇总 添加ma ...

  6. 洛谷 P1525 【关押罪犯】种类并查集

    题解 P1525 [关押罪犯]:种类并查集 前言: 在数据结构并查集中,种类并查集属于扩展域并查集一类. 比较典型的题目就是:食物链(比本题难一些,有三个种类存在) 首先讲一下本题的贪心,这个是必须要 ...

  7. 【转】2019年3月 最新win10激活密匙 win10各版本永久激活序列号 win10正式版激活码分享

    现在市面上大致有两种主流激活方法,一种是通过激活码来激活,另外一种是通过激活工具来激活.但是激活工具有个弊端就是激活时间只有180天,很多网友都想要永久激活,现在已经过了win10系统免费推广期了,所 ...

  8. o(1), o(n), o(logn), o(nlogn)算法复杂度

    在描述算法复杂度时,经常用到o(1), o(n), o(logn), o(nlogn)来表示对应算法的时间复杂度, 这里进行归纳一下它们代表的含义: 这是算法的时空复杂度的表示.不仅仅用于表示时间复杂 ...

  9. screen命令记录

    1.screen -x 进入 2.ctrl+a+n 下一个 3.ctrl+a+p 上一个任务 4.ctrl+a+d 退出 5.ctrl+c 结束任务 其他 screen -ls 所有任务 screen ...

  10. opencv学习笔记(八)IplImage* 访问图像像素的值

    opencv2.1版本之前使用IplImage*数据结构来表示图像,2.1之后的版本使用图像容器Mat来存储.IplImage结构体如下所示. typedef struct _IplImage { i ...