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