2010年12月9日 星期四

C# 使用SqlBulkCopy將資料批次寫入資料庫

之前demo有介紹利用SqlDataSoure和手動撰寫ADO.NET的方式大量新增資料的方法,雖然已經有效的改善了寫入的速度,但在發現了SqlBulkCopy以後,發現它更是威力強大,現在就來介紹SqlBulkCopy的猛。
  //一開始我們先產生一個DataTable來裝我們要寫入的資料 
DataTable dt = new DataTable();
dt.Columns.Add("id", typeof(int));
dt.Columns.Add("name", typeof(string));

//因為SqlBulkCopy的猛就是大量的一次寫入,所以我們也來跑10萬筆吧
int i;
for (i = 0; i < 100000; i++)
{
DataRow dr = dt.NewRow();
dr["name"] = i.ToString();
dt.Rows.Add(dr);
}

//宣告連結字串
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ASPNETDBConnectionString1"].ConnectionString);

conn.Open();
//宣告SqlBulkCopy
using (SqlBulkCopy sqlBC = new SqlBulkCopy(conn))
{
//設定一個批次量寫入多少筆資料
sqlBC.BatchSize = 1000;
//設定逾時的秒數
sqlBC.BulkCopyTimeout = 60;

//設定 NotifyAfter 屬性,以便在每複製 10000 個資料列至資料表後,呼叫事件處理常式。
sqlBC.NotifyAfter = 10000;
sqlBC.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnSqlRowsCopied);

//設定要寫入的資料庫
sqlBC.DestinationTableName = "dbo.Table1";

//對應資料行
sqlBC.ColumnMappings.Add("id", "id");
sqlBC.ColumnMappings.Add("name", "name");

//開始寫入
sqlBC.WriteToServer(dt);
}
conn.Dispose();
}
void OnSqlRowsCopied(object sender, SqlRowsCopiedEventArgs e)
{
Response.Write("---
");
}

測試環境:SQL2005 Express
測試資料量:10萬筆
測試次數:10次
平均秒數:2.3532秒

太可怕啦,之前的寫法如果真的要寫10萬筆這種大量的資料都需花費一分鐘左右,但使用了SqlBulkCopy卻只要短短的兩秒鐘,下表看的出來如果資料筆數很少就沒必要使用SqlBulkCopy了。

寫入十萬筆資料10次的平均秒數
使用SqlBulkCopy:2.2051
使用AddWithValue:63.418
寫入一萬筆資料10次的平均秒數
使用SqlBulkCopy:0.2188
使用AddWithValue:6.3856
寫入一千筆資料10次的平均秒數
使用SqlBulkCopy:0.0187
使用AddWithValue:0.5805
寫入一百筆資料10次的平均秒數
使用SqlBulkCopy:0.0062
使用AddWithValue:0.0353
寫入十筆資料10次的平均秒數
使用SqlBulkCopy:0.004
使用AddWithValue:0.004

沒有留言:

張貼留言