开发者社区> 真爱无限> 正文

.Net中EF针对大数据量查询超时的一种优化

简介: 旧代码: --receiptIds   id集合,每次查1000左右 var mappingList = new List(); mappingList.
+关注继续查看

旧代码:
--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查询慢的问题,能加快程序总体运行速度,因为,我们网站应用 ,大部分时间是耗在数据库操作上,所以能减少数据库查询时间,就能减少完成一个操作的整体运行时间。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【.NET 6】使用EF Core 访问Oracle+Mysql+PostgreSQL并进行简单增改操作与性能比较
唠嗑一下。都在说去O或者开源,但是对于数据库选型来说,很多人却存在着误区。例如,去O,狭义上讲,是去Oracle数据库。但是从广义上来说,是去Oracle公司产品或者具有漂亮国垄断地位和需要商业授权的数据库产品。
44 0
.Net Core 的WebApi项目使用mysql的EF CodeFirst模式
.Net Core 的WebApi项目使用mysql的EF CodeFirst模式
23 0
.NET的EF框架中:在应用程序配置文件中找不到名为“”的连接字符串问题
.NET的EF框架中:在应用程序配置文件中找不到名为“”的连接字符串问题
169 0
.NET Core 使用 EF 出错的解决方法
.NET Core 使用 EF 出错的解决方法
195 0
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 查询)--学习笔记
- 关联数据加载 - 客户端与服务端运算 - 跟踪与不跟踪 - 复杂查询运算 - 原生 SQL 查询 - 全局查询筛选器
152 0
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 基础与配置)--学习笔记
- 连接字符串 - 异步编程 - 日志 - DbContext池 - 类和配置表 - 属性和列配置 - 并发token - 索引
195 0
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 介绍)--学习笔记
- ORM - Repository 仓储 - UnitOfWork 工作单元 - DB Context 与 DB Set - EF Core快速开始示例
196 0
.net core Entity Framework 与 EF Core
重点讲 Entity Framework Core ! (一)Entity Framework            它是适用于.NET 的对象关系映射程序 (ORM),现在的EF6已经是久经沙场,并经历重重磨难,获得一致认可的数据访问技术(原来加 Title 也挺有意思的,哈哈哈)。
1412 0
+关注
真爱无限
主要技术.net sqlserver mysql。
文章
问答
文章排行榜
最热
最新
相关电子书
更多
RDS SQL Server CPU高使用率性能优化
立即下载
RDS SQL Server CPU 高使用率性能优化
立即下载
低代码开发师(初级)实战教程
立即下载