最近需要对客户的系统进行升级,在对一张记录只有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。
看来代码的优化在某些时候是非常重要的……