一. 开发中常见的性能问题
我们在日常开发过程中,由于一些不好的习惯,经常会导致所写的代码性能低下,却毫无发觉,下面就总结一下常见的一些性能问题。
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 ...
随机推荐
-
python 日期相关的各种操作总结
用 Python 做项目时,经常会遇到与日期转换相关,日期计算相关的功能,动不动就要去查python手册,感觉麻烦,因此把自己常用的一些东西,总结了一下,总体说来到目前为止遇到如下一些需求: 1. 用 ...
-
github 添加 C# IGNORE
在创建仓库时选择 VisualStudio 即可.
-
EF当实体模型与数据库的架构不同时要删除数据库时的报错问题
当使用的EF的时候,我们都知道EF当实体模型与数据库的架构不同时要删除数据库,这是会把错: 无法创建与 'master' 数据库之间的连接,这是因为已打开原始数据库连接,并且已从连接字符串中删除凭据. ...
-
SGU 191.Exhibition(模拟)
时间限制:0.25s 空间限制:4M 题意: 有两个公司A.B,他们要展览物品,但是A公司的展柜要放B公司的物品,B公司的展柜要放A公司物品.最开始只有一个空柜台,从指定的一个公司开始,轮流进行操作, ...
-
201521123093 java 第六周学习总结
1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...
-
C# WinForm ShowInTaskbar Api Version
using System; using System.Runtime.InteropServices; namespace x { unsafe class NativeWindow { /* * W ...
-
linux三剑客
grep grep "oldboy" test.txt 过滤掉文件中oldboy的字符串 -v ...
-
Windows两个网卡配置路由规则 同时访问内网和外网
电脑上有两个网卡,一个有线一个无线,有线连局域网,无线连外网,虽然两个网都连着,但还是会出现访问不通的情况. 这就要求我们自己来配置路由规则,让内网的访问走内网的网卡,外网的访问走外网的网卡. 一.查 ...
-
Git Bash使用详细教程
https://blog.csdn.net/wangrenbao123/article/details/55511461/
-
Python3基础 input 输入浮点数,整数,字符串
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...