一. 开发中常见的性能问题

  我们在日常开发过程中,由于一些不好的习惯,经常会导致所写的代码性能低下,却毫无发觉,下面就总结一下常见的一些性能问题。

1. 真假分页

  ① 假分页: db.xxx.toList().Skip(2).take(4) 。

   ② 真分页:db.xxx.Skip(2).take(3).toList() 。

2. 合理的使用EF的数据加载方式

  EF的加载方式有:立即加载、延迟加载、显示加载。

  详见:

    ①: 第五节: EF高级属性(一) 之 本地缓存、立即加载、延迟加载(不含导航属性)

    ②: 第六节: EF高级属性(二) 之延迟加载、立即加载、显示加载(含导航属性)

3. NoTracking的使用

  EF查询出来的实体,默认是跟踪状态的,如果查询出来的实体不需要修改或者删除,查询的时候可以删除状态跟踪,变为Detached状态,来提高性能。

    关于EF状态的跟踪,详见后面章节,敬请期待!!

     using (DbContext context = new MyDbContext())
{
var people = context.Student.Where(p => p.Id > ).AsNoTracking().ToList();
}

4. 合理的使用SQL事务

  将与事务无关的一些SQL语句放到事务外,如果一个事务中的SQL语句过长,很容易出现死锁问题,压力测试时,出现资源被锁的错误。

二. 关于EF数据操作的性能问题

  EF自诞生以来,大批量的操作增加、删除、修改操作数据效率一直很低,1000条数据以内,效率尚且可以接受(10s内),但随着数据量逐渐增大,很容易在执行的过程中就宕机了,相当尴尬。在本章节,我们一起来测试一下,EF在不进行任何优化的情况下,几种写法的效率问题。

  我们这里的测试是以增加数据为例,先把测试的三种写法的结论贴上。

1. 每添加1条数据,savechange一下(小白常犯的错误,坚决抵制这种做法!!)

      private static void NewMethod1(DbContext db)
{
Console.WriteLine("-------------1. 每添加1条数据,savechange一下(小白常犯的错误,坚决抵制这种做法!!)-------------------");
Stopwatch watch = Stopwatch.StartNew();
for (int i = ; i < ; i++)
{
TestOne t = new TestOne();
t.id = Guid.NewGuid().ToString("N");
t.t1 = "t1+" + i;
t.t1 = "t2+" + i;
db.Set<TestOne>().Add(t);
db.SaveChanges();
}
watch.Stop();
Console.WriteLine("1000条数据耗时:{0}", watch.ElapsedMilliseconds);
}

2. 先将所有数据添加到内存里,最后再savechange

  private static void NewMethod2(DbContext db, int count)
{
Console.WriteLine("-------------2. 先将所有数据添加到内存里,最后再savechange-------------------");
Stopwatch watch = Stopwatch.StartNew();
for (int i = ; i < count; i++)
{
TestOne t = new TestOne();
t.id = Guid.NewGuid().ToString("N");
t.t1 = "t1+" + i;
t.t1 = "t2+" + i;
db.Set<TestOne>().Add(t);
}
db.SaveChanges();
watch.Stop();
Console.WriteLine("{0}条数据耗时:{1}", count, watch.ElapsedMilliseconds);
}

3. 使用addRange方法,先将数据加到list集合中,然后一次性通过addRange加到内存里

      private static void NewMethod3(DbContext db, int count)
{
Console.WriteLine("-------------3. 使用addRange方法,先将数据加到list集合中,然后一次性通过addRange加到内存里-------------------");
Stopwatch watch = Stopwatch.StartNew();
List<TestOne> tList = new List<TestOne>();
for (int i = ; i < count; i++)
{
TestOne t = new TestOne();
t.id = Guid.NewGuid().ToString("N");
t.t1 = "t1+" + i;
t.t1 = "t2+" + i;
tList.Add(t);
}
db.Set<TestOne>().AddRange(tList);
db.SaveChanges();
watch.Stop();
Console.WriteLine("{0}条数据耗时:{1}", count, watch.ElapsedMilliseconds);
}

  总结:EF自有的方法,三个阶段如上,数据超过1000条,性能直线下降,那么怎么来解决EF处理大数据量的性能问题呢?敬请期待下一个章节:   第九节: EF的性能篇(二) 之 Z.EntityFramework.Extensions程序集解决EF的性能问题

第八节: EF的性能篇(一) 之 EF自有方法的性能测试的更多相关文章

  1. 第九节: EF的性能篇(二) 之 Z.EntityFramework.Extensions程序集解决EF的性能问题

    一. 综述 该模块主要介绍:EF的性能优化插件Z.EntityFramework.Extensions,该插件收费. (一). 简介 1. 相关网站:http://www.zzzprojects.co ...

  2. 第二十三节: EF性能篇(三)之基于开源组件 Z.EntityFrameWork.Plus.EF6解决EF性能问题

    一. 开篇说明 EF的性能问题一直以来经常被人所吐槽,究其原因在于“复杂的操作在生成SQL阶段耗时长,且执行效率不高”,但并不是没有办法解决,从EF本身举几个简单的优化例子: ①:如果仅是查询数据,并 ...

  3. EF性能优化-有人说EF性能低,我想说:EF确实不如ADO.NET

    十年河东,十年河西,莫欺少年穷. EF就如同那个少年,ADO.NET则是一位壮年.毕竟ADO.NET出生在EF之前,而EF所走的路属于应用ADO.NET. 也就是说:你所写的LINQ查询,最后还是要转 ...

  4. MVC教程--MiniProfiler.EF监控调试MVC和EF的性能

    上一篇谈到mvc中ef输出执行sql日志:来谈用mvc开发项目的调试和性能监控.EF框架自动给我生成sql语句,当我们的程序遇到性能问题的时候我们可以用MiniProfiler.EF来监控调试MVC和 ...

  5. EF提高性能

    实体框架 5 性能注意事项 作者:David Obando.Eric Dettinger 等 发布时间:2012 年 4 月 1.简介 对象关系映射框架是一种在面向对象的应用程序中提供数据访问抽象的便 ...

  6. MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划

    这篇文章主要介绍了MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划的相关资料,需要的朋友可以参考下 一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存 ...

  7. EF的性能改善和思考

    EF是个工具,用的好了性能就会很好,用的不好性能就会有很大损失. 先从EF的设计思想来讲解 EF的初衷是根据缓存中的实体对象,以及实体对象的状态(删除.更新.添加)来对数据库进行操作,这些实体对象.以 ...

  8. 你是否还在质疑EF的性能

    1. 写在前面的话 一直没有写博客的习惯,感觉太浪费时间,没有那么多精力,其实仔细一想,写博客是一种习惯,也是一种心境,同时也是对自己所掌握的知识结构的一个梳理过程,对自己知识体系的一个巩固,同时也是 ...

  9. C#实用杂记-EF全性能优化技巧

    原文链接:http://www.makmong.com/947.html#comment-31 EntityFramework 优化建议 2016年1月15日 下午4:54 LEILINKANG   ...

随机推荐

  1. Windows系统资源监控

    1.windows自带系统资源监控工具 2.Windows监控的数据来源:Performance Counters 2.1 Performance Counter架构 2.2 Performance ...

  2. Python基础——8错误、调试和测试

    捕捉错误 try: print('try...') r = 10 / int('2') print('result:', r) except ValueError as e: print('Value ...

  3. Python开发【前端篇】HTML

    1.html概述和基本结构 html概述 HTML是 HyperText Mark-up Language 的首字母简写,意思是超文本标记语言,超文本指的是超链接,标记指的是标签,是一种用来制作网页的 ...

  4. Hive:ORC File Format存储格式详解

    一.定义 ORC File,它的全名是Optimized Row Columnar (ORC) file,其实就是对RCFile做了一些优化. 据官方文档介绍,这种文件格式可以提供一种高效的方法来存储 ...

  5. centos7 搭建ntp时钟服务器

    服务器 : 192.168.137.3 客户机:  192.168.137.6 1. 服务器端 centos7下首先确认服务器的防火墙.selinux关闭状态 # cat /etc/redhat-re ...

  6. Storm入门(三)HelloWorld示例

    一.配置开发环境 storm有两种操作模式: 本地模式和远程模式.使用本地模式的时候,你可以在你的本地机器上开发测试你的topology, 一切都在你的本地机器上模拟出来; 用远程模式的时候你提交的t ...

  7. 启动Hadoop总是需要输入密码的问题.

    start-all.sh 总是需要输入当前密码. 一开始以为是权限不够. 1.修改sudo配置文件 sudo visudo 增加 hduser ALL=(ALL) NOPASSWD:ALL 解决了 权 ...

  8. day4-python基础-编码相关

    目录 1.编码的历史 2.python 3.x中的bytes与str 3.编码的转换 正文开始 1.编码的历史与发展 1.1编码历史变更 编码可以理解为谍战片中电报的密码本,如果要想让电脑识别要输入的 ...

  9. 解决chrome安装谷歌访问助手错误问题

    解决chrome安装谷歌访问助手错误问题 针对新版本安装谷歌访问助手插件报错问题 1.下载谷歌访问助手 http://www.ggfwzs.com/ 2.chrome浏览器打开发者模式 3.将下载的c ...

  10. 将docker镜像上传到docker hub