.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 SPI簡介 1.1 SPI(Service Provider Interface) 本質:將介面實現類的全限定名配置在文件中,並由服務載入器讀取配置文件,載入實現類。這樣可以在運行時,動態為介面替換實現類。 java SPI:用來設計給服務提供商做插件使用的。基於策略模式來實現動態載入的機制。我 ...
  • Go 1.21中新增的 slices包中提供了很多與切片相關的函數,適用於任意類型的切片。 本文內容來自官方文檔 BinarySearch 函數簽名如下: func BinarySearch[S ~[]E, E cmp.Ordered](x S, target E) (int, bool) Bina ...
  • 哈嘍大家好,我是鹹魚 好久不見甚是想念,2023 年最後一次法定節假日已經結束了,不知道各位小伙伴是不是跟鹹魚一樣今天就開始“搬磚”了呢? 我們知道元組(tuple)是 Python 的內置數據類型,tuple 是一個不可變的值序列 tuple 的元素可以是任何類型,一般用在存儲異構數據(例如資料庫 ...
  • 用Rust手把手編寫一個wmproxy(代理,內網穿透等), HTTP改造篇之HPACK原理 項目 ++wmproxy++ gite: https://gitee.com/tickbh/wmproxy github: https://github.com/tickbh/wmproxy HTTP/2的 ...
  • 本以為跟國際化無緣,不在軟體的考慮範圍內,沒想到偶爾一個項目還是繞不開,小記一下System.Globalization.CultureInfo.InstalledUICulture.Name 這是獲得英文的區域碼,也就是zh-cn的這種,需要找區域碼字典對照。 System.Globalizati ...
  • 變數類型的轉化: 轉換原則 同類型的大的可以裝小的,小類型的裝大的就需要強制轉換。 隱式轉換: 同種類型的轉換: //有符號 long——>int——>short——>sbyte long l = 1; int i = 1; short s = 1; sbyte sb = 1; //隱式轉換 int ...
  • 讀取請求體流的demo public static async Task<string> GetBodyForm(this HttpContext http) { var content = string.Empty; var request = http.Request; try { reques ...
  • 支持.Net Core(2.0及以上)與.Net Framework(4.0及以上) 【目錄】 前言 Post請求 Get請求 與其它工具的比較 1【前言】 http請求調用是開發中經常會用到的功能。 在內,調用自有項目的Web Api等形式介面時會用到;在外,調用一些第三方功能介面時,也會用到,因 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...