博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.Net中EF针对大数据量查询超时的一种优化
阅读量:6320 次
发布时间:2019-06-22

本文共 2214 字,大约阅读时间需要 7 分钟。

旧代码:
--receiptIds   id集合,每次查1000左右
var mappingList = new List<FinanceSettlementMapping>();
mappingList.AddRange(SettlementMappingRepository.Entities.Include(o => o.ReceiptsTo).Include(d => d.FinanceSettlement).Where(d => receiptIds.Contains(d.ReceiptIdFrom)).ToList());
mappingList.AddRange(SettlementMappingRepository.Entities.Include(o => o.ReceiptsTo).Include(d => d.FinanceSettlement).Where(d => receiptIds.Contains(d.ReceiptIdTo)).ToList());
--FinanceSettlementMapping -500w数据,9个字段
--ReceiptsTo,外键表,FinanceReceipts --800w数据,64个字段
--FinanceSettlement  --200w数据,15个字段
//FinanceSettlementMapping join FinanceSettlement join FinanceReceipts  表数据越大,连接越慢,可能会超时
新代码:外键表FinanceReceipts数据单独查询
var mappingList = new List<FinanceSettlementMapping>();
var settlementmapFromList = SettlementMappingRepository.Entities.Include(d => d.FinanceSettlement).Where(d => receiptIds.Contains(d.ReceiptIdFrom)).ToList();
if (settlementmapFromList.Count > 0)
{
var toreceiptIds = settlementmapFromList.Select(o => o.ReceiptIdTo).ToArray();
var toreceipts = ReceiptsRepository.Entities.Where(o => toreceiptIds.Contains(o.ReceiptId)).ToList();//查询数据到内存
foreach (var map in settlementmapFromList)//循环内存数据赋值
{
var tempreceipt = toreceipts.Where(o => o.ReceiptId == map.ReceiptIdTo).FirstOrDefault();
map.ReceiptsTo = tempreceipt;
}
}
mappingList.AddRange(settlementmapFromList);
var settlementmapToList = SettlementMappingRepository.Entities.Include(d => d.FinanceSettlement).Where(d => receiptIds.Contains(d.ReceiptIdTo)).ToList();
if (settlementmapToList.Count > 0)
{
var toreceiptIds = settlementmapToList.Select(o => o.ReceiptIdTo).ToArray();
var toreceipts = ReceiptsRepository.Entities.Where(o => toreceiptIds.Contains(o.ReceiptId)).ToList();//查询数据到内存
foreach (var map in settlementmapToList)//循环内存数据赋值
{
var tempreceipt = toreceipts.Where(o => o.ReceiptId == map.ReceiptIdTo).FirstOrDefault();
map.ReceiptsTo = tempreceipt;
}
}

mappingList.AddRange(settlementmapToList);

//1000条数据,最差的线性查询时间复杂度 (1+1000)*1000/2 ,本次查询的是Id,是数字类型,如果系统用的是二叉树或其他快速查询方法,就更快,再者,查询到之后,把toreceipts 值赋给map.ReceiptsTo,只是修改了map.ReceiptsTo的指针地址,没有赋值操作,当然也是很快的,实测1000数据0.006s。

解决了大数据量表的Join查询慢的问题,能加快程序总体运行速度,因为,我们网站应用 ,大部分时间是耗在数据库操作上,所以能减少数据库查询时间,就能减少完成一个操作的整体运行时间。

转载地址:http://tvjaa.baihongyu.com/

你可能感兴趣的文章
css3 background
查看>>
A BYTE OF PYTHON 文件备份的WINRAR版本
查看>>
linux ifconfig命令参数及用法详解--linux查看配置网卡命令
查看>>
Guice系列之用户指南(十一)
查看>>
数据挖掘的方法有哪些?
查看>>
ENode框架Conference案例分析系列之 - 架构设计
查看>>
C# 视频监控系列(6):服务器端——封装API(上) [HikServer.dll]
查看>>
SqlService过期的解决方案
查看>>
由于字符集问题导致 Package Body created with compilation errors.
查看>>
Express模版引擎hbs备忘
查看>>
Symantec Backup Exec Remote Agent 2010在Redhat Enterprise 6.6上启动问题
查看>>
关于redo writing竞争
查看>>
Android下 使用百度地图sdk
查看>>
Qt之重启应用程序
查看>>
c++ template学习总结3
查看>>
INBOUND_CONNECT_TIMEOUT与SQLNET.INBOUND_CONNECT_TIMEOUT小结
查看>>
codeforces A. Bayan Bus(简单模拟)
查看>>
App提交审核被拒的原因汇总(不断更新...)
查看>>
iOS之小功能模块--彩虹动画进度条学习和自主封装改进
查看>>
Cocos2D旋转炮塔到指定角度(二)
查看>>