首页 > 数据库 >.NET 数据库大数据操作方案(插入、更新、删除、查询 、插入或更新)

.NET 数据库大数据操作方案(插入、更新、删除、查询 、插入或更新)

时间:2023-10-10 10:34:57浏览次数:41  
标签:数据库 db 更新 插入 操作 NET 数据

1、功能介绍 

海量数据操作ORM性能瓶颈在实体转换上面,并且不能使用常规的Sql去实现

当列越多转换越慢,SqlSugar将转换性能做到极致,并且采用数据库最佳API

操作数据库达到极限性能,当然你如果不用sqlsugar了解一下原理也可以使用其他ORM实现

 

BulkCopy

BulkCopy是一种用于高效批量插入大量数据到数据库的技术。其原理是利用数据库系统提供的高性能数据导入接口,将数据以批量的方式一次性写入数据库,而不是逐条插入。这种方法比逐条插入要快得多,因为减少了数据库操作的次数,从而降低了系统开销

1 2 3 db.Fastest<DC_Scene>().BulkCopy(lstData); db.Fastest<Order>().PageSize(100000).BulkCopy(insertObjs); //Winfom中要用Task.Run 底层是异步实现

  

BulkUpdate

使用BulkCopy将大量数据快速导入临时表中。然后,通过表与表之间的高效操作(如UPDATE语句)进行数据更新,而不是逐条处理。这种方法降低了数据库操作的频率,减少了系统开销,从而提高了更新效率。最后,及时清理临时表,确保数据的一致性和数据库性能的稳定性。这种策略在大规模数据更新时能够显著提升性能和效率

1 2 3 db.Fastest<RealmAuctionDatum>().BulkUpdate(GetList())//更新 db.Fastest<RealmAuctionDatum>().PageSize(100000).BulkUpdate(GetList())//更新 //Winfom中要用Task.Run 底层是异步实现

  

BulkMerge (5.1.4.109)

大数据 : 插入或者更新

原理Oracle和SqlServer使用了Merge Into+BulkCopy ,其他库使用分页+BulkCopy +查询验证

1 2 3 db.Fastest<Order>().BulkMerge(List); db.Fastest<Order>().PageSize(100000).BulkMerge(List); //Winfom中要用Task.Run 底层是异步实现

使用BulkCopy将需要更新的数据批量导入到临时表(或者使用临时内存表)中。
使用MERGE INTO语句将临时表中的数据与目标表进行比较和合并。根据需要更新的条件,判断是否执行更新操作,同时可以在MERGE INTO语句中指定需要更新的列。
通过一次性的批量操作,实现了大规模数据的高效更新,减少了数据库操作的次数,提高了性能。
这种方法结合了数据库的批量导入和灵活的条件更新,适用于需要处理大规模数据更新的场景,提供了高效、快速的数据更新解决方案。

  

BulkQuery

纯手工指定映射+Emit绑定防止类型冲突引起的装拆和拆箱并且预热后达到原生水准

db.Queryable<Order>().ToList(); //分页降低内存 适合复杂的DTO转换和导出
List<Order> order = new List<Order>(); 
db.Queryable<Order>().ForEach(it=> { order.Add(it); /*禁止这儿操作数据库因为会循环*/} ,2000);

 

BulkDelete

删除操作慢的原因包括事务处理、索引更新、并发锁定、数据量大、触发器和硬件性能等。为提高性能,可分批次删除。

1 db.Deleteable<Order>(list).PageSize(1000).ExecuteCommand();

  

Select INTO

表和表之间的导入,如果在同一个库中并且表已存在性能比bulkcopy要快些
1 2 3 4 5 6 7 8 9 10 11 12 Select INTO 表和表之间的导入 //例1:不同实体插入 Select Into db.Queryable<Order>()  //.IgnoreColumns(it=>it.Id) 如果是自增可以忽略,不过ID就不一样了    .Select(it=>new { name=it.name,......})             .IntoTable<实体2>();      //例2: 同实体不同表插入    db.Queryable<Order>()  //.IgnoreColumns(it=>it.Id) 如果是自增可以忽略,不过ID就不一样了 .IntoTable<Order>("新表名");

 

SqlBulkCopy 类

(在.NET中提供的用于高性能批量操作数据的类)结合ORM框架进行大数据插入和更新。结合 SqlBulkCopy 进行大数据处理可以提供更高的性能,下面是一些优化原则和最佳实践:

1. 使用事务:

将 SqlBulkCopy 操作放在一个数据库事务中。这样,如果插入或更新过程中发生错误,你可以回滚整个操作,确保数据的一致性。

2. 调整 BatchSize 

BatchSize 表示每个批次中的行数。根据数据库性能和网络带宽,调整批次大小以提高性能。通常情况下,使用合理的批次大小可以最大限度地减少数据库的往返次数,提高性能。

BulkCopyTimeout 表示超时时间(以秒为单位),如果在指定的时间内操作没有完成,操作将被中断。根据数据量的大小和网络条件,调整超时时间。

3. 使用临时表:
有时,将数据先插入到一个临时表中,然后执行SQL语句将数据从临时表复制到目标表,这种方法也可以提高性能。这是因为临时表可以不受约束和索引的影响,插入速度更快。
4. 注意内存使用:
在进行大数据操作时,需要注意内存的使用情况,以防止内存溢出。可以考虑分批次处理数据,避免一次性加载大量数据到内存中。
综上所述,结合使用 SqlBulkCopy 和ORM框架时,通过调整参数、合理使用事务、关闭索引和约束等方式,可以最大限度地提高大数据插入和更新的性能。

更多用法:

Nuget安装 - SqlSugar 5x - .NET果糖网

标签:数据库,db,更新,插入,操作,NET,数据
From: https://www.cnblogs.com/sexintercourse/p/17753985.html

相关文章

  • .Net Core 统一全局处理字符串为Null问题
    services.AddControllersWithViews().AddNewtonsoftJson(options=>{//设置序列化时间格式options.SerializerSettings.DateFormatString="yyyy-MM-ddHH:mm:ss";options.Serializ......
  • .Net Core 中GUID字符串的几种格式化
    NET下的Guid格式化有如下五种:1.Guid.NewGuid().ToString("N")获取32位不包含“-”号的GUID字符串例如:1c64d58a9e834bfe8d053555d81453d02.Guid.NewGuid().ToString("D")获取32位包含“-”号的GUID字符串,默认格式例如:ae8672ac-a987-43f3-a7c2-ac7b3249ac7b3.Guid.NewGuid().......
  • Vue 异步更新、$nextTick
    Vue是异步更新DOM的,想要在dom更新完成之后做某件事,可以使用 $nextTick  $nextTick:等dom更新后,才会触发执行此方法里的函数体语法:this.$nextTick( ()=>{   //业务逻辑}) eg:this.$nextTick( ()=>{   this.$refs.inp.focus()})......
  • Essential .NET - C# 7.0:细说元组
    Essential.NET-C#7.0:细说元组作者 MarkMichaelis在去年11月的Connect();专题(msdn.microsoft.com/magazine/mt790178)中,我概述了C#7.0,并介绍了元组。在本文中,我将重新深入探究元组,并全方位地介绍语法选项。首先,让我们来想想下面这个问题:为什么要使用元组?有时,可......
  • Docker 本地化镜像导入导出(针对服务器无法连接外网进行更新)
    镜像在开发公网测试环境中是可以下载的,但在某些生产环境中是无法访问外网进行镜像的拉取。这时候就只能在测试或者开发环境先保存镜像,然后复制到生产的机器,然后加载到生产本地机器,下面就来介绍下该如何操作。1.下载镜像到本地dockerpullregistry.cn-shenzhen.aliyuncs.com......
  • 网安周报|Mixin Network 云服务商数据库遭到攻击,涉案金额约 2 亿美元
    1、MixinNetwork云服务商数据库遭到攻击,涉案金额约2亿美元MixinNetwork是一个开源的数字资产点对点交易网络,今天在Twitter上宣布,由于该平台遭受了黑客攻击,存款和取款立即暂停。据报道,该攻击的目标是Mixin云服务提供商的数据库,涉案金额约2亿美元。由于在黑客攻击中损失了大量资......
  • .net 调用webservice 总结
    最近做一个项目,由于是在别人框架里开发app,导致了很多限制,其中一个就是不能直接引用webservice。我们都知道,调用webserivice最简单的方法就是在"引用" 那里点击右键,然后选择"引用web服务",再输入服务地址。确定后,会生成一个app.config里面就会自动生成了一些配置信息。现......
  • .net C# 流量限制令牌桶算法工具类
    流量限制令牌桶算法工具类usingSystem;usingSystem.Collections.Generic;usingSystem.Diagnostics;usingSystem.Threading;usingSystem.Threading.Tasks;namespaceCommon{///<summary>///令牌桶算法工具类///</summary>publicclassTokenB......
  • 电表DLT645转BACnet /IP协议网关
    DLT645、IEC104协议、JAE1939协议和BACnetMS/TP协议都是在智能建筑和楼宇自动化领域中常用的通信协议。为了更好地实现不同系统之间的数据交互,将这三种协议转换为BACnetMS/TP协议的网关越来越受到关注。DLT645、IEC104协议和JAE1939协议与BACnetMS/TP协议之间的转换主要是将源协......
  • BACnet转Modbus协议采集网关
    DNP3.0、Lonworks和KNX是三种在智能建筑和楼宇自动化领域中常用的协议,而Modbus协议是一种在工业自动化领域广泛应用的协议。将DNP3.0、Lonworks、KNX协议转换为Modbus协议在实践中可以提高不同系统之间的互操作性,从而实现更高效和智能的建筑管理。将DNP3.0、Lonworks、KNX协议转换......