第八节: EF的性能篇(一) 之 EF自有方法的性能测试
一. 开发中常见的性能问题
我们在日常开发过程中,由于一些不好的习惯,经常会导致所写的代码性能低下,却毫无发觉,下面就总结一下常见的一些性能问题。
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自有方法的性能测试的更多相关文章
- 第九节: EF的性能篇(二) 之 Z.EntityFramework.Extensions程序集解决EF的性能问题
一. 综述 该模块主要介绍:EF的性能优化插件Z.EntityFramework.Extensions,该插件收费. (一). 简介 1. 相关网站:http://www.zzzprojects.co ...
- 第二十三节: EF性能篇(三)之基于开源组件 Z.EntityFrameWork.Plus.EF6解决EF性能问题
一. 开篇说明 EF的性能问题一直以来经常被人所吐槽,究其原因在于“复杂的操作在生成SQL阶段耗时长,且执行效率不高”,但并不是没有办法解决,从EF本身举几个简单的优化例子: ①:如果仅是查询数据,并 ...
- EF性能优化-有人说EF性能低,我想说:EF确实不如ADO.NET
十年河东,十年河西,莫欺少年穷. EF就如同那个少年,ADO.NET则是一位壮年.毕竟ADO.NET出生在EF之前,而EF所走的路属于应用ADO.NET. 也就是说:你所写的LINQ查询,最后还是要转 ...
- MVC教程--MiniProfiler.EF监控调试MVC和EF的性能
上一篇谈到mvc中ef输出执行sql日志:来谈用mvc开发项目的调试和性能监控.EF框架自动给我生成sql语句,当我们的程序遇到性能问题的时候我们可以用MiniProfiler.EF来监控调试MVC和 ...
- EF提高性能
实体框架 5 性能注意事项 作者:David Obando.Eric Dettinger 等 发布时间:2012 年 4 月 1.简介 对象关系映射框架是一种在面向对象的应用程序中提供数据访问抽象的便 ...
- MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划
这篇文章主要介绍了MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划的相关资料,需要的朋友可以参考下 一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存 ...
- EF的性能改善和思考
EF是个工具,用的好了性能就会很好,用的不好性能就会有很大损失. 先从EF的设计思想来讲解 EF的初衷是根据缓存中的实体对象,以及实体对象的状态(删除.更新.添加)来对数据库进行操作,这些实体对象.以 ...
- 你是否还在质疑EF的性能
1. 写在前面的话 一直没有写博客的习惯,感觉太浪费时间,没有那么多精力,其实仔细一想,写博客是一种习惯,也是一种心境,同时也是对自己所掌握的知识结构的一个梳理过程,对自己知识体系的一个巩固,同时也是 ...
- C#实用杂记-EF全性能优化技巧
原文链接:http://www.makmong.com/947.html#comment-31 EntityFramework 优化建议 2016年1月15日 下午4:54 LEILINKANG ...
随机推荐
- 产品设计-后台管理权限设计RBAC
最近在做OA系统,设计到不同的员工会拥有不同权限对OA进行操作,总结了一下整体的设计 做权限的分配就是为了更好的管理不同类别的员工,如人事部可以看到普通员工的薪酬,可以查看全部员工的考勤数据请假等,而 ...
- Django中的信号
信号 Django 提供一个“信号分发器”,允许解耦的应用在框架的其它地方发生操作时会被通知到. 简单来说,信号允许特定的sender通知一组receiver某些操作已经发生. 这在多处代码和同一事件 ...
- Offset Management For Apache Kafka With Apache Spark Streaming
An ingest pattern that we commonly see being adopted at Cloudera customers is Apache Spark Streaming ...
- centos查看系统信息命令
1.cd - :返回上次所在的目录 2.查看系统版本 cat /etc/redhat-release 3.查看linux内核版本1)cat /proc/version 2) uname -a3) un ...
- 如何基于Winform开发框架或混合框架基础上进行项目的快速开发
在开发项目的时候,我们为了提高速度和质量,往往不是白手起家,需要基于一定的基础上进行项目的快速开发,这样可以利用整个框架的生态基础模块,以及成熟统一的开发方式,可以极大提高我们开发的效率.本篇随笔就是 ...
- Redis入门之增删改查等常用命令总结
Redis是用C语言实现的,一般来说C语言实现的程序"距离"操作系统更近,执行速度相对会更快. Redis使用了单线程架构,预防了多线程可能产生的竞争问题. 作者对于Redis源代 ...
- Django组件 之中间件
-------------------------------------------------------------------落花不是无情物,待到山花烂漫时. 中间件 中间件的概念 中间件顾名 ...
- 如何将多个C文件链接在一起----Makefile编写及make指令
需使用GCC编译器,关于MinGW的安装指南:https://people.eng.unimelb.edu.au/ammoffat/teaching/20005/Install-MinGW.pdf 单 ...
- 爬zol村壁纸篇
# -*- coding: utf-8 -*- # @Author : Jackzz import requests,os from pyquery import PyQuery as pq def ...
- 栈(LIFO)
1 栈的定义 栈是限定在表尾进行插入和删除操作的线性表. 2 栈的特点 1)栈是特殊的线性表,线性表也具有前驱后继性: 2)栈的插入和删除操作只能在表尾即栈顶进行: 3)后进先出. 3 栈的实现及关键 ...