最近需要对客户的系统进行升级,在对一张记录只有7767条记录的表进行分次查询时,每次查询500条,16次查询居然使用了2分钟时间。代码如下:
public static List<T> GetList(int pageIndex, int pageSize, out int count) { using (var db = new ClientDBDataContext(DBHelper.DBConString)) { var query = db.DataBase_Table; count = query.Count(); return query.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList(); } }
调试结果显示,一次比一次查询的时间长,到第14次查询时,耗时20s之多,不忍直视,那还有记录达到百万条的又该如何???
baidu…… google……
其答案:
排除硬件原因,有以下可能:
1.你的OOXX写的不好,没利用到索引
2.表设计的不好,字段过多,导致返回数据过大
3.zp对象的构造函数/各属性有没有自定义加入了耗时的处理?
4.用ef的话,关闭proxy,关闭自动侦测实体状态
分析上述貌似都不对,当查看DataBase_Table的LINQ扩展时,发现了AsParallel(),查看说明:启用查询的并行化。
代码:
public static List<T> GetList(int pageIndex, int pageSize, out int count) { using (var db = new ClientDBDataContext(DBHelper.DBConString)) { var query = db.DataBase_Table.AsParallel(); count = query.Count(); return query.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList(); } }
运行,整个16次查询不到1s。
吓死宝宝了……
看来代码的优化在某些时候是非常重要的……