HTML5技术

EF查询百万级数据的性能测试 - Flaming丶淡蓝

字号+ 作者:H5之家 来源:H5之家 2017-07-06 10:06 我要评论( )

一、起因 个人还是比较喜欢EF的,毕竟不用写Sql,开发效率高,操作简单,不过总是听人说EF的性能不是很好,也看过别人做的测试,但是看了就以为真的是那样。但是实际上到底是怎么样,说实话我真的不知道。我只知道选什么的框架是基于实际情况的,博主在一个

一、起因 

   个人还是比较喜欢EF的,毕竟不用写Sql,开发效率高,操作简单,不过总是听人说EF的性能不是很好,也看过别人做的测试,但是看了就以为真的是那样。但是实际上到底是怎么样,说实话我真的不知道。我只知道选什么的框架是基于实际情况的,博主在一个创业公司上班,选的就是EF框架,刚做了一个项目,数据也就几万不到,感觉性能没那么差劲。于是,就想多弄点数据测试一下。再说一遍,本着 求真务实的方针,是针对现实中的业务需求来测试的,不是来单比性能的。你要是做个ERP系统,都去考虑千万级并发的架构,那当我没说。毕竟不是基于实际项目的框架选择都是耍流氓。

二、声明

         基于实际的项目,考虑到博主一般的遇到的上线项目对于数据的增删改操作时,操作的数据一般都是一个,两个,多了有十几个,对于一下同时提交几十个数据进行增删改的,原谅博主还没有见过,更有甚者,提交几百个数据进行增删改,博主想也是没有想过。但是在这个数量级下的增删改操作,我相信EF还是能够胜任的,所以本文不再测试EF的增删改性能,因为感觉完全能够满足一般项目的需要。本文只测试EF的单表查询功能,之后有时间会做复杂的链接查询的测试。

三、测试条件

 

      

    老百姓的配置,自己的工作电脑。

    Sql Server 2012,Entity Framework 6.1.3。

四、测试数据

  鉴于以前看过的测试都是两三个字段,且数据过于简单,以防有这方面的影响,又因为实际项目中的字段可能较多,而且数据量也比较复杂,就模拟了一个较为接近的数据表,再说一遍,本着求真务实的革命主义方针,针对现实的项目来测试。

    

    数据量100W

    

五、开始测试

    做了一个WinForm的测试,界面如下

    

    1.进行Find测试,随机生成id,左边显示查询用时,先上代码。

    

1    private PortalContext db = new PortalContext(); count = 0; 3 private TimeSpan ts = new TimeSpan(); btnFind_Click(object sender, EventArgs e) 5 { 6 7 count++; 8 Random r = new Random(); 9 var id = r.Next(0, 1000000); 10 txtId.Text = id.ToString(); 11 12 Stopwatch sw = new Stopwatch(); 13 sw.Start(); 14 var user = db.Users.Find(id); 15 sw.Stop(); 16 17 txtUserInfo.Text = UserToString(user); 18 ts += sw.Elapsed; + sw.Elapsed.Seconds + + sw.Elapsed.Milliseconds + ; + id + + time + Environment.NewLine); + count + + new TimeSpan((ts.Ticks / count)); 22 }

 

 

 

    结果如下:

    

    可以看出,在100w数据的情况下,利用Find根据主键id查询根本无压力,至于第一次很长时间,应该是连接数据花费了一些时间。

   2.进行Where测试,代码如下。

btnWhere_Click(object sender, EventArgs e) 2 { [] valids = new bool[] { false, true }; , , , , }; 7 UserType[] userTypes = new[] { UserType.合作方, UserType.普通用户, UserType.律师 }; 8 Random r = new Random(); num = r.Next(0, 4680); 11 int num2 = r.Next(0, 4680); max = Math.Max(num, num2); 14 int min = Math.Min(num, num2); isValid = valids[num % 2]; 17 string work = works[num % 5]; 18 UserType type = userTypes[num % 2]; 19 20 txtIsValid.Text = isValid.ToString(); 21 txtWork.Text = work; 22 txtUserType.Text = type.ToString(); 23 txtAmountMin.Text = min.ToString(); 24 txtAmountMax.Text = max.ToString(); 25 26 Stopwatch sw = new Stopwatch(); 27 sw.Start(); 28 var query = db.Users.Where(u => true); 29 var queryWhere = query.Where(u =>u.UserType == type &&u.IsValid == isValid && u.Work == work && (u.Amount >= min && u.Amount <= max)).Take(1000); 30 var list = queryWhere.ToList(); 31 sw.Stop(); , 34 type,isValid,work, min, max); time = sw.Elapsed + + sw.Elapsed.Seconds + + sw.Elapsed.Milliseconds + ; +list.Count()++ time + Environment.NewLine); 38 39 }

 

 

 

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 微软虐我千百遍——记一次比较漫长的TFS数据库迁移 - LibraJM

    微软虐我千百遍——记一次比较漫长的TFS数据库迁移 - LibraJM

    2017-07-05 15:03

  • Vue.js 基础指令实例讲解(各种数据绑定、表单渲染大总结)——新手入门、高手进阶 - Mr.聂

    Vue.js 基础指令实例讲解(各种数据绑定、表单渲染大总结)——新手

    2017-07-03 11:00

  • easyui框架--基础篇(一)--数据表格datagrid(php与mysql交互) - 渡劫的机器猫

    easyui框架--基础篇(一)--数据表格datagrid(php与mysql交互) -

    2017-07-02 17:03

  • 实现excel导入导出功能,excel导入数据到页面中,页面数据导出生成excel文件 - 还是盼盼好

    实现excel导入导出功能,excel导入数据到页面中,页面数据导出生成ex

    2017-07-02 13:00

网友点评