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

net,数据库,数据,方案,插入,更新,删除,查询 · 浏览次数 : 11

小编点评

**功能介绍:** **BulkCopyBulkCopy是一种用于高效批量插入大量数据到数据库的技术。其原理是利用数据库系统提供的 高性能数据导入接口,将数据以批量的方式一次性写入数据库,而不是逐条插入。** **性能优势:** * 减少了数据库操作的次数,降低了系统开销。 * 提高了更新效率。 * 及时清理临时表,确保数据的一致性。 **使用方法:** ```csharp // 创建 BulkCopy 对象 var bulkCopy = new BulkCopyBulkCopy(); // 连接数据库 var db = new DbConnection(); // 批量插入数据 bulkCopy.AddRange(insertObjs); // 执行批量插入 db.Fastest.BulkCopy(insertObjs); // 关闭数据库连接 db.Close(); ``` **优化原则:** * 使用事务。 * 设置批次大小。 * 使用临时表。 * 注意内存使用。 **其他最佳实践:** * 使用 SqlSugar 进行性能测试。 * 考虑使用其他 ORM 进行性能比较。 * 优化数据库性能。

正文

1、功能介绍 

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

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

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

 

BulkCopy

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

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

  

BulkUpdate

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

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 +查询验证

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

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

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

  

Select INTO

表和表之间的导入,如果在同一个库中并且表已存在性能比bulkcopy要快些
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果糖网

与.NET 数据库大数据 方案(插入、更新、删除、查询 、插入或更新)相似的内容:

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

1、功能介绍 海量数据操作ORM性能瓶颈在实体转换上面,并且不能使用常规的Sql去实现 当列越多转换越慢,SqlSugar将转换性能做到极致,并且采用数据库最佳API 操作数据库达到极限性能,当然你如果不用sqlsugar了解一下原理也可以使用其他ORM实现 BulkCopy BulkCopy是一种

Bond——大数据时代的数据交换和存储格式

设想我们在一家很大的互联网公司做IT方面的规划、开发和维护,有以下这样的应用场景: 公司里有若干个不同的开发团队,开发语言有Java、.net、Python、C++....十来种,还有很多外包团队对项目进行开发,大中小系统已经多的数不过来;并且各个团队、系统间都需要进行海量数据的交换(比如搜索引擎实

[转帖]云数据库是杀猪盘么,去掉中间商赚差价,aws数据库性能提升 10 倍!价格便宜十倍。

https://tidb.net/blog/021059f1 于是乎dba中的冯大嘴喊出了云数据库就是杀猪盘。让每个公司自建数据库。 那么有没有一种数据库又便宜又好用呢。有 哪就是tidb数据库。 之前一个dba工程师的工作内容可能包括以下几个方面: 监控带宽、流量、并发、业务接口等关键资源及访问信

[转帖]Redis 最佳实践(上)

https://my.oschina.net/jiagoushi/blog/5601975 引言 尽管 redis 是一款非常优秀的 NoSQL 数据库,但更重要的是,作为使用者我们应该学会在不同的场景中如何更好的使用它,更大的发挥它的价值。主要可以从这四个方面进行优化:Redis 键值设计、批处理

.NET性能优化-使用内存+磁盘混合缓存

我们回顾一下上一篇文章中的内容,有一个朋友问我这样一个问题: > 我的业务依赖一些数据,因为数据库访问慢,我把它放在Redis里面,不过还是太慢了,有什么其它的方案吗? 其实这个问题比较简单的是吧?Redis其实属于网络存储,我对照下面的这个表格,可以很容易的得出结论,既然网络存储的速度慢,那我们就

一种对数据库友好的GUID的变种使用方法

.NET生成的GUID唯一性很好,用之方便,但是,缺少像雪花算法那样的有序性。虽然分布式系统中做不到绝对的有序,但是,相对的有序对于目前数据库而言,索引效率等方面的提升还是有明显效果的(当然,我认为,这是数据库的问题,而非编程的问题,数据库应该处理好任何类型数据作为主键索引时的性能,除非在SQL标准...

[转帖]TiDB损坏多副本之有损恢复处理方法

https://tidb.net/blog/b1ae4ee7 TiDB分布式数据库采用多副本机制,数据副本通过 Multi-Raft 协议同步事务日志,确保数据强一致性且少数副本发生故障时不影响数据的可用性。在三副本情况下,单副本损坏可以说对集群没什么影响,但当遇到多副本损坏的损坏丢失的时候,如何快

go项目实现mysql接入以及web api

本文为博主原创,转载请注明出处: 创建go项目,并在go项目中接入mysql,将mysql的配置项单独整理放到一个胚子和文件中,支持项目启动时,通过加载配置文件中的值,然后创建数据库连接。 之后使用net/http相关的库,创建路由,并在路由中通过不同的http方法,实现mysql连接的test数据

[转帖]几种数据库 jar 包获取方式

https://my.oschina.net/u/4526289/blog/5610299 摘要:以下提供的都是各个数据库较为官方的 jar 包获取方式。 本文分享自华为云社区《JDBC 连接相关 jar 包获取及上传管理中心白名单处理》,作者:HuaWei XYe。 jar 包获取 以下提供的都是

[转帖]Oracle数据库的两种授权收费方式详解

https://www.jb51.net/article/265823.htm 现在Oracle有两种授权收费方式,按CPU(Process)数和按用户数(Named User Plus),前一种方式一般用于用户数不确定或者用户数量很大的情况,典型的如互联网环境,这篇文章主要介绍了Oracle数据库