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


    1、功能介绍 

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

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

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

     

    BulkCopy

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

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

      

    BulkUpdate

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

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

      

    BulkMerge (5.1.4.109)

    大数据 : 插入或者更新

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

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

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

      

    BulkQuery

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

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

     

    BulkDelete

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

    1
    db.Deleteable(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()
     //.IgnoreColumns(it=>it.Id) 如果是自增可以忽略,不过ID就不一样了  
     .Select(it=>new { name=it.name,......})           
     .IntoTable<实体2>();
        
    //例2: 同实体不同表插入   
    db.Queryable()
     //.IgnoreColumns(it=>it.Id) 如果是自增可以忽略,不过ID就不一样了
    .IntoTable("新表名");

     

    SqlBulkCopy 类

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

    1. 使用事务:

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

    2. 调整 BatchSize 

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

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

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

    更多用法:

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

  • 相关阅读:
    大学生WEB前端静态网页——旅游介绍35页 响应式,
    SkyWalking 本地启动以及闪退问题
    图像&视频编辑工具箱MMEditing使用示例:图像超分辨率(super-resolution)
    thinkphp5 加载静态资源路径与常量的方法
    麒麟KYLINIOS软件仓库搭建02-软件仓库添加新的软件包
    【附源码】Python计算机毕业设计面向智慧课堂的教学过程管理系统
    加速释放传统企业业务潜力,S2B2B商城建设方案引领电商模式新风向
    新一批光学好书已上架
    基于JAVA疫情防控网站计算机毕业设计源码+系统+数据库+lw文档+部署
    神仙级别Kafka架构笔记,阿里架构师看到都感慨怎么没早看到
  • 原文地址:https://www.cnblogs.com/sunkaixuan/p/17747938.html