在博客园看了不少其他大神的经验。今天也抽空贡献点自己的经验(并不是说自己也是大神。。小弟还只新手程序员去年才毕业的)

好了废话不多说,直接进入主题。(具体的好坏各位看官就随便看看吧。。没有什么好坏之分,纯粹只是一次优化过程的经历。)

首先介绍下项目背景

为某政府单位做的项目,市级的。

用的是Entity Framework 的框架(具体内部如何,不便透露,尽请谅解)

然后说下数据量 大概8W家企业数据,

每家企业大概会有1-2条记录

然后对这部分数据进行报表统计

一共需要统计8个类型的数据

大致表格就是14行8列的数据

然后我们对于每个单元格的数据 都要去读取一下 数据库。

具体请参照代码

     public DataTable mytestMethod(DateTime dtbegintime, DateTime dtendtime)
{
DataTable dt = new DataTable();
dt.Columns.Add("ID", typeof(string));
dt.Columns.Add("1", typeof(string));
dt.Columns.Add("2", typeof(string));
dt.Columns.Add("3", typeof(string));
dt.Columns.Add("4", typeof(string));
dt.Columns.Add("5", typeof(string));
dt.Columns.Add("6", typeof(string));
dt.Columns.Add("7", typeof(string));
dt.Columns.Add("8", typeof(string));
List<区> qus = Content.QuServices.GetList();
foreach( qu in qus)
{
datarow dr=dt.newrow();
dr["1"]=获取的数据.count;
......
.......
dr["8"]=获取的数据.count; dt.Rows.Add(dr); };
dt.DefaultView.Sort = "1";
dt = dt.DefaultView.ToTable();
return dt;
}

  

我们对于每张表 都只能获取这个表的实体。无法做到组合操作

例如 班级表 学生表  爱好表

就只能获取 list<班级>或者 list<学生>

如果学生里面有部分属性需要使用爱好表的操作的话

就是用懒加载的 学生表。爱好表.属性  来操作

第一个版本的 结果就是 我们可能只是用到  查询出来 的学生表 的个数就够了

但是我们获取过来的却是list<学生表>然后 list<学生表>.count 来获取个数。

这样的话 从各方面考虑都大大制约了速度。

后来我就想到了用分页的方法

我们底层会有一个分页方法

pageData 类型

包含两个属性 一个 是totalCount(总数) 一个datalist(分页部分的数据)

然后我就想到利用分页获取 也就出些了下面这部分代码

   public DataTable mytestMethod(DateTime dtbegintime, DateTime dtendtime)
{
DataTable dt = new DataTable();
dt.Columns.Add("ID", typeof(string));
dt.Columns.Add("1", typeof(string));
dt.Columns.Add("2", typeof(string));
dt.Columns.Add("3", typeof(string));
dt.Columns.Add("4", typeof(string));
dt.Columns.Add("5", typeof(string));
dt.Columns.Add("6", typeof(string));
dt.Columns.Add("7", typeof(string));
dt.Columns.Add("8", typeof(string));
List<区> qus = Content.QuServices.GetList();
foreach( qu in qus)
{
datarow dr=dt.newrow();
dr["1"]=获取分页的数据.totalCount;//分页的pagesize 和pageindex 都传1
......
.......
dr["8"]=获取分页的数据.totalCount; dt.Rows.Add(dr); };
dt.DefaultView.Sort = "1";
dt = dt.DefaultView.ToTable();
return dt;
}

  

大致就是利用分页的方法 获取数据的时候只获取 1,1 的数据

这样即可以得到总数又简化了数据量

效果的话并是特别明显但也快了大概4秒的样子。。原先是17秒的 现在要13秒左右

当然这肯定是不行的

然后我导师就让我用Parallel.ForEach 来代替 forearch方法。

这会速度提升非常明显,大概提升了 一倍吧。原先13秒的速度 如今只用 6秒左右了 。但是偶尔会7-8秒的样子

另外发现parallel 非常吃性能。。如果多刷几次的话 貌似就会悲剧掉。

至于Parallel的用法 ,大家可以自己百度一下。

这边需要注意的是 parallel 是并行处理。所以做运算的时候需要注意下 ,不然数据很容易出错。

最后发现显然还是用SQL 直接组合起来查询比较好。

因为不管老的怎么并行处理 到最后他都是会做14*8=112 次数据查询操作。

所以最后只能继续苦逼的写SQL 组合查询 了。

速度的话 从6秒优化到了3秒 。

本来以为使用了我们的框架就可以脱离sql语句的编写了。没想到最后还是回归了SQL的怀抱。。

哎。。第一次写这种经验类的文章

文章写的很乱。可能很多人看不懂吧,希望大家见谅。

如果发现看到最后是浪费大家的时间 还请各位大神息怒息怒。

最后总结下 就是 从foreach 到parallel 到 SQL的过程

记一次Entity Framework 项目的优化过程的更多相关文章

  1. Entity Framework的启动速度优化

    最近开发的服务放到IIS上寄宿之后,遇到一些现象,比如刚部署之后,第一次启动很慢:程序放置一会儿,再次请求也会比较慢.比如第一个问题,可以解释为初次请求某一个服务的时候,需要把程序集加载到内存中可能比 ...

  2. Entity Framework 项目使用心得

    在博客园很久了,一直只看不说,这是发布本人的第一个博客. 总结一下在项目中,EntityFramework使用的一下经验拿来和大家分享,希望对大家有用~ 1.         在Entity Fram ...

  3. Entity Framework 实体框架的形成之旅--实体数据模型 (EDM)的处理(4)

    在前面几篇关于Entity Framework 实体框架的介绍里面,已经逐步对整个框架进行了一步步的演化,以期达到统一.高效.可重用性等目的,本文继续探讨基于泛型的仓储模式实体框架方面的改进优化,使我 ...

  4. Entity FrameWork对有外键关联的数据表的添加操作

    前天做了一个MVC Entity FrameWork项目,遇到有外键关联的数据编辑问题.当你编辑的时候,按照正常的逻辑,把每个字段的数据都对号入座了,然后点击保存按钮,本以为会顺理成章的编辑数据,但是 ...

  5. Entity Framework 全面教程详解(转)

    目录 预备知识    2 LINQ技术 2 LINQ技术的基础 - C#3.0    2 自动属性    2 隐式类型    2 对象初始化器与集合初始化器    3 匿名类    3 扩展方法    ...

  6. 转载Entity Framework全面教程

    转载原地址:http://www.cnblogs.com/lsxqw2004/archive/2009/05/31/1495240.html#_Toc228672754 预备知识    2 LINQ技 ...

  7. Entity Framework 教程(转)

    预备知识    2 LINQ技术    2 LINQ技术的基础 - C#3.0    2 自动属性    2 隐式类型    2 对象初始化器与集合初始化器    3 匿名类    3 扩展方法    ...

  8. [hystar整理]Entity Framework 教程

    参考页面: http://www.yuanjiaocheng.net/entity/entity-relations.html http://www.yuanjiaocheng.net/entity/ ...

  9. Entity Framework的原理及使用方式

    ADO.NET Entity Framework操作数据库的过程对用户是透明的(当然我们可以通过一些工具或方法了解发送到数据库的SQL语句等).我们唯一能做的是操作EDM,EDM会将这个操作请求发往数 ...

随机推荐

  1. Eucalyptus管理页面密码设置

    桉树环境什么的都已经是配置好了的,但是过了一段时间不用,也不知道密码是什么了,看着下面的页面也不知道如何进去,这里我们通过命令行的方式重置用户名和密码信息. 登陆clc所在机器,输入下命令: euar ...

  2. ansible 2.1.0 api 编程

    pdf文档 https://media.readthedocs.org/pdf/ansible/latest/ansible.pdf api介绍 http://blog.csdn.net/python ...

  3. 【硬盘整理】使用UltimateDefrag将常用文件放置在磁盘最外圈

    使用方法未知.软件截图如下: 官方网站(英文):http://www.disktrix.com/ 汉化破解版V3.0下载地址:http://page2.dfpan.com/fs/7com9monca3 ...

  4. ZooKeeper保证之单一视图(Single System Image)

    由于ZooKeeper的数据模型简单且全部在内存中,ZooKeeper的速度非常快.它提供了一系列保证(Guarantees): • 顺序一致性(Sequential Consistency) • 原 ...

  5. 【BZOJ1854】[SCOI2010] 游戏(匈牙利算法的应用)

    点此看题面 大致题意: 有\(n\)个物品,每个物品有两个属性且只能选择其中的一个,要求选择的物品属性值从\(1\)开始递增,问最多能选多少个. 暴搜 看到这题,我第一反应是暴搜... ... 好不容 ...

  6. Object.prototype.toString的应用

    使用Object.prototype上的原生toString()方法判断数据类型,使用方法如下: Object.prototype.toString.call(value)1.判断基本类型: Obje ...

  7. fflush - 刷新一个流

    SYNOPSIS 总览 #include <stdio.h> int fflush(FILE *stream); DESCRIPTION 描述 函数 fflush 强制在所给的输出流或更新 ...

  8. 漫谈 Clustering (1): k-means

    好久没有写 blog 了,一来是 blog 下线一段时间,而租 DreamHost 的事情又一直没弄好:二来是没有太多时间,天天都跑去实验室.现在主要折腾 Machine Learning 相关的东西 ...

  9. oc字典放入到数组里,根据字典里的属性排序(重点)

    #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { ...

  10. SPOJ1043 GSS1(线段树)

    题意 给出$n$个数,每次询问区间$(l, r)$内最大字段和 Sol 在合并子树的时候,答案仅有四种情况 打四个标记维护即可 查询同理,用类似update的方式合并 注意查询的时候不能按照以前的方式 ...