.NET 資料庫大數據 方案(插入、更新、刪除、查詢 、插入或更新)

来源:https://www.cnblogs.com/sunkaixuan/archive/2023/10/08/17747938.html
-Advertisement-
Play Games

1、功能介紹 海量數據操作ORM性能瓶頸在實體轉換上面,並且不能使用常規的Sql去實現 當列越多轉換越慢,SqlSugar將轉換性能做到極致,並且採用資料庫最佳API 操作資料庫達到極限性能,當然你如果不用sqlsugar瞭解一下原理也可以使用其他ORM實現 BulkCopy BulkCopy是一種 ...


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果糖網


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一,註冊公眾號 1,官網地址:申請測試公眾號 地址: 微信公眾平臺 (qq.com) 文檔地址:微信開放文檔 (qq.com) 2,註冊後可以查看自己的appId 和 appsecret 3,創建模板 請註意: 1、測試模板的模板ID僅用於測試,不能用來給正式帳號發送模板消息 2、為方便測試,測試模 ...
  • 初始化? 給定一個字元串,求其最長迴文串,比如: aababa,最長迴文長度為 3,是ababa; abbabb,最長迴文長度為 2,是abba; 以上兩個迴文串有奇迴文和偶迴文,這樣處理比較繁瑣,需要我們進行分類討論。 所以我們第一步就是先將字元串統一處理為奇迴文。 也就是將每兩個字元串之間插入一 ...
  • 內部平臺的一個小功能點的實現過程,分享給大家: 遞歸解析Json,可以實現生成可視化Tree+快速獲取JsonPath。 步驟: 1.利用JsonPath讀取根,獲取JsonObject 2.遞歸層次遍歷JsonObjec,保存結點信息 3.利用zTree展示結點為可視化樹,點擊對應樹的結點即可獲取 ...
  • 早在C++11就在STL中引入了原子操作支持了。大部分時候,我使用C++11的atomic僅僅是為了原子地操作特定的一個變數,比如`load`、`store`、`fetch_add`等等。然而實際上,C++11的原子操作帶著的memory order還能起到memory barrier的作用。本文會... ...
  • 本教程中,我們將學習如何在 Spring Boot 中整合使用 Log4j2 日誌框架。 Log4j2 介紹 Spring Boot 中預設使用 Logback 作為日誌框架,接下來我們將學習如何在 Spring Boot 中集成與配置 Log4j2。在配置之前,我們需要知道的是 Log4j2 是 ...
  • 柱狀圖,是一種使用矩形條,對不同類別進行數值比較的統計圖表。在柱狀圖上,分類變數的每個實體都被表示為一個矩形(通俗講即為“柱子”),而數值則決定了柱子的高度。 1. 主要元素 柱狀圖是一種用長方形柱子表示數據的圖表。它包含三個主要元素: 橫軸(x軸):表示數據的類別或時間。 縱軸(y軸):表示數據的 ...
  • 歡迎訪問我的GitHub 這裡分類和彙總了欣宸的全部原創(含配套源碼):https://github.com/zq2599/blog_demos 本篇概覽 本文是《Strimzi Kafka Bridge(橋接)實戰》的第三篇,前文咱們掌握了Strimzi Kafka Bridge的基本功能:基於h ...
  • 當你需要為你的 Go 項目創建一個強大的命令行工具時,你可能會遇到許多挑戰,比如如何定義命令、標誌和參數,如何生成詳細的幫助文檔,如何支持子命令等等。為瞭解決這些問題,github.com/spf13/cobra 就可以派上用場。 github.com/spf13/cobra 是一個用於構建強大的命 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...