测试记录EF插入查询性能
Posted 深井田蛙
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了测试记录EF插入查询性能相关的知识,希望对你有一定的参考价值。
介绍
背景什么就不提了,无外乎出现了大数据需要处理。简单的说就是我测试了EF正常的插入以及一个优化小方式而已,然后做了查询记录。其余没有什么,写这篇只是为了记录结果方便以后数据参考吧。
代码介绍:
首先是插入代码常规:
EFHelp<TimeRecord> eFHelp = new EFHelp<TimeRecord>(); for (int i = 0; i < 20000; i++) { TimeRecord t = new TimeRecord(); t.id = Guid.NewGuid().ToString("N"); t.childId = Guid.NewGuid().ToString("N"); t.state = 0; t.stateTime = DateTime.Now.AddDays(1).ToString("yyyy-MM-dd"); eFHelp.AddNo(t); } for (int i = 0; i < 30000; i++) { TimeRecord t = new TimeRecord(); t.id = Guid.NewGuid().ToString("N"); t.childId = Guid.NewGuid().ToString("N"); t.state = 1; t.stateTime = DateTime.Now.AddDays(2).ToString("yyyy-MM-dd"); eFHelp.AddNo(t); } eFHelp.SaveChange();
然后是优化处理方法:
public testEntities() : base("name=testEntities") { this.Configuration.AutoDetectChangesEnabled = false; }
没有错就是增加一句话,这句话主要是取消EF的状态变化跟踪。想要了解更多的请自行百度这个东西。
推荐这骗写的很好:https://www.cnblogs.com/hehexiaoxia/p/5707180.html
多说一句我们都知道在6.0之后增加AddRang方法,我也大概测试了一些与这个方法差不多,我想也许AddRang方法里面就是封装了这个东西吧。
查询方法:
//查询 EFHelp<TimeRecord> eFHelp = new EFHelp<TimeRecord>(); var dataG = eFHelp.Entities.GroupBy(b => b.childId); //var dataG = eFHelp.Entities.Where(b => b.state == 1).GroupBy(b => b.childId).Select(s => se(s.ToList())); List<TimeRecord> listResult = new List<TimeRecord>(); foreach (var item in dataG) { Func<List<TimeRecord>, TimeRecord> fun = delegate (List<TimeRecord> listData) { TimeRecord timeResult = listData.Where(t => Convert.ToDateTime(t.stateTime) <= Convert.ToDateTime("2018-05-23")).OrderByDescending(b => b.stateTime).FirstOrDefault(); if (timeResult == null) { return null; } else { if (timeResult.state == 1) { return timeResult; } else { return null; } } }; //TimeRecord time = se(item.ToList()); TimeRecord time = fun(item.ToList()); if (time != null) { listResult.Add(time); } } listResult = listResult.OrderBy(b => b.id).Skip(0).Take(15).ToList(); foreach (var item in listResult) { Console.WriteLine("查询的id:" + item.stateTime + "查询的时间:" + item.stateTime); }
因为我做了筛选,做一下实际场景。所有不是只取而是做了条件查询。
结果数据:
插入3万条,
1万2018-05-20 0状态
2万2018-05-21 1状态
测试数据(次) |
数据量 |
时间(毫秒=秒) |
插入3万(1) |
0 |
402884=402.88 |
查询15条数据(1) |
3万 |
2766=2.76 |
查询15条数据(2) |
3万 |
2976=2.96 |
查询15条数据(3) |
3万 |
3250=3.25 |
查询15条数据(4) |
3万 |
3083=3.08 |
查询15条数据(5) |
3万 |
2966=2.69 |
查询15条数据(6) |
3万 |
3015=3.01 |
修改其中一条数据改为2018-05-20后重新查询,为了防止时间都是一样的验证查询的准确性,在查询打印结果中我在第一条数据看到时间修改为2018-02-20的数据说明查询的准确, 然后时间也在上面查询时间范围内,所有时间没有误差 |
||
查询15条数据(1) |
3万 |
2971=2.97 |
查询15条数据(2) |
3万 |
2652=2.65 |
再次修改其中一条childId设置为重复,验证多次查询问题的准确性 |
||
查询15条数据(1) |
3万 |
2819=2.81 |
查询15条数据(2) |
3万 |
3370=3.37 |
5万条测试,在3万基础上在录入2万条
1万2018-05-22 0状态
1万2018-05-23 1状态
测试数据(次) |
数据量 |
时间(毫秒=秒) |
插入2万(2) |
3万 |
193700=193.7 |
查询15条数据(1) |
5万 |
3149=3.14 |
查询15条数据(2) |
5万 |
3526=3.52 |
查询15条数据(3) |
5万 |
2922-2.92 |
查询15条数据(4) |
5万 |
3688=3.68 |
查询15条数据(5) |
5万 |
3339=3.33 |
查询15条数据(6) |
5万 |
3024=3.02 |
查询15条数据(7) |
5万 |
2921=2.91 |
查询15条数据(9) |
5万 |
3156=3.15 |
查询15条数据(10) |
5万 |
3304=3.3 |
查询15条数据(11) |
5万 |
3588=3.58 |
以上表格数据主要是查询数据。其中第一个是常规的插入数据为了与下面的做对比。
最后使用了无状态(AutoDetectChangesEnabled)添加3万所用时间13689=13秒。5万:21410=21秒,21667,
AddRang批量添加3万:13962=13秒,14034=14秒,5万21366=21秒
最后我用10万数据查询:3448,3482,3379,3288
然后是22万:7093,6074,5405,5976,5421,5442,5967
27万数据:9200,6384,6987,6575,6305,
以上是关于测试记录EF插入查询性能的主要内容,如果未能解决你的问题,请参考以下文章