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
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框架時,透過調整引數、合理使用事務、關閉索引和約束等方式,可以最大限度地提高大資料插入和更新的效能。