[食譜好菜] 用 SqlBulkCopy 批次 Insert 大量資料讓你想不到的快

  • 37819
  • 0
  • C#
  • 2017-02-10

SqlBulkCopy 它不是個新玩意兒,但是我最近才認識它,「你不知道你還有哪些不知道」是一件很恐怖的事情,原來 SqlBulkCopy 在 .NET 2.0 就有了,它的出現讓 Insert 大量資料變得更方便了,我只能感嘆相見恨晚。

我是參考 Demo 哥寫的這篇文章 - 使用SqlBulkCopy將資料批次寫入資料庫

測試環境

我已經在資料庫建立好一個資料表叫 TableTable,只有兩個欄位 IdName,沒有主鍵、沒有索引,而資料庫版本是 SQL Server on Linux,OS 及硬體環境跟這篇文章一樣。

SqlBulkCopy

我們先來看看 SqlBulkCopy 這個類別的常用屬性跟方法:

  • BatchSize:一次批次寫入多少筆資料
  • NotifyAfter:在寫入多少筆資料後呼叫 SqlRowsCopied 事件
  • BulkCopyTimeout:逾時秒數
  • ColumnMappings:如果我們資料來源的 DataTable 的 ColumnName 跟要寫入的資料表的 ColumnName 是不一樣的,或是只寫入部分的欄位,就要在 ColumnMappings 新增額外的對應。
  • DestinationTableName:要寫入的資料表名稱
  • WriteToServer():寫入資料的方法

下面是屬性值的參考範例

批次 Insert 大量資料

WriteToServer() 方法有幾個多載,它允許我們傳入 DataRow[]DataTableIDataReaderDbDataReader 當做資料來源,我選擇使用 DataTable 來儲存資料來源,一次 create 三十萬筆,欄位名稱跟欄位的資料型別都是跟資料庫中的資料表是對應的。

直接指定目標資料表之後,呼叫 WriteToServer() 方法。

我們可以看到三十萬筆,一秒六,資料就進去了。

偏要用 INSERT INTO 語法會怎樣?

我們來看看一般用 INSERT INTO 語法搭配 Dapper,一次寫入三十萬筆資料。

執行結果(它真的有在跑,別認為是當掉了。)

這次算是交了 SqlBulkCopy 這個朋友,看它在處理大量資料的英姿,既豪邁又奔放,外加在送資料進資料庫時不小心霸氣外露,誰看了都會被它給攝服。

 < Source Code >

相關資源

C# 指南
ASP.NET 教學
ASP.NET MVC 指引
Azure SQL Database 教學
SQL Server 教學
Xamarin.Forms 教學