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

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

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. Python 位操作运算符

    & 按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0 (a & b) 输出结果 12 ,二进制解释: 0000 1100 | 按位或运算符:只要对应的二 ...

  2. Django REST framework基础:分页

    DRF分页组件 为什么要使用分页 我们数据表中可能会有成千上万条数据,当我们访问某张表的所有数据时,我们不太可能需要一次把所有的数据都展示出来,因为数据量很大,对服务端的内存压力比较大还有就是网络传输 ...

  3. web框架。Django--

    一,DIY一个web框架 1.1什么是web框架 1.2用socket模拟B-S的服务端 1.3,浏览器端的network查看 1.4,request格式 1.5,response格式 1.6,初识w ...

  4. 【Python 01】Python可以做什么

    Python学习未来方向: 1.数据分析 2.自然语言处理 3.社交网络分析 4.人工智能 5.深度学习 6.计算机视觉 7.网络爬虫 8.量化交易

  5. 记一次生产数据库"意外"重启的经历

    前言 在一个阳光明媚的下午,电脑右下角传来一片片邮件提醒,同时伴随着微信钉钉的震动,打开一看,应用各种出错,天兔告警,数据库服务器内存爆红,Mysql数据库实例挂掉了. 排查 先交代一下数据库版本: ...

  6. SpringCloud(6)分布式配置中心Spring Cloud Config

    1.Spring Cloud Config 简介 在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件.在Spring Cloud中,有分布式配置中心组 ...

  7. Java 208 道面试题:第一模块答案

    目前市面上的面试题存在两大问题:第一,题目太旧好久没有更新了,还都停留在 2010 年之前的状态:第二,近几年 JDK 更新和发布都很快,Java 的用法也变了不少,加上 Java 技术栈也加入了很多 ...

  8. 通过secureCRT连接虚拟机VMware workstation问题记录

    很急没有使用虚拟机了,今天再登录的时候,发现用secureCRT连接不上VMware workstation 1.连接步骤: 1)打开secureCRT,点击+ 新建一个连接 2)按照流程一步一步配置 ...

  9. openstack第四章:neutron— 网络服务

    第四篇neutron— 网络服务 一.neutron 介绍:   Neutron 概述 传统的网络管理方式很大程度上依赖于管理员手工配置和维护各种网络硬件设备:而云环境下的网络已经变得非常复杂,特别是 ...

  10. 【学习总结】GirlsInAI ML-diary day-11-while循环

    [学习总结]GirlsInAI ML-diary 总 原博github链接-day11 认识while循环执行 对于while/break/continue的认识 新值替换变量 一般while语句 无 ...