ADO.Net的批量插入
在做大批量資料插入的時候,如果用Insert into ... values (...)這種方式的話效率極低,這裡介紹兩種效能比較好的批量插入方法。
1. 使用SqlBulkCopy
private static long SqlBulkCopyInsert()
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
DataTable dataTable = GetTableSchema();
string passportKey;
for (int i = 0; i < count; i++)
{
passportKey = Guid.NewGuid().ToString();
DataRow dataRow = dataTable.NewRow();
dataRow[0] = passportKey;
dataTable.Rows.Add(dataRow);
}
SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(connectionString);
sqlBulkCopy.DestinationTableName = "Passport";
sqlBulkCopy.BatchSize = dataTable.Rows.Count;
SqlConnection sqlConnection = new SqlConnection(connectionString);
sqlConnection.Open();
if (dataTable!=null && dataTable.Rows.Count!=0)
{
sqlBulkCopy.WriteToServer(dataTable);
}
sqlBulkCopy.Close();
sqlConnection.Close();
stopwatch.Stop();
return stopwatch.ElapsedMilliseconds;
}
使用SqlBulkCopy類進行資料插入其原理是採用了SQL Server的BCP協議進行資料的批量複製。這裡我們先要建好一個DataTable(最好是通過DataAdapter來灌資料得到,因為這樣出來的DataTable就已經有跟資料表相同的列定義,可以免去之後Mapping Column的步驟),把要插入的資料加進這個DataTable中,然後用SqlBulkCopy的例項來插入到資料庫中。經過測試,SqlBulkCopy方法比直接用Sql語句插入資料的效率高出將近25倍。
2. 使用資料庫中的Table型別變數實現資料插入
這種方法的前提是資料庫中必須支援Table型別的變數。
Create Type PassportTableType as TableCreate PROCEDURE [dbo].[CreatePassportWithTVP]
(
PassportKey nvarchar(50)
)
@TVP PassportTableType readonly
AS
BEGIN
SET NOCOUNT ON;
Insert into Passport(PassportKey) select PassportKey from @TVP
END
private static long TVPInsert()
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
DataTable dataTable = GetTableSchema();
string passportKey;
for (int i = 0; i < count; i++)
{
passportKey = Guid.NewGuid().ToString();
DataRow dataRow = dataTable.NewRow();
dataRow[0] = passportKey;
dataTable.Rows.Add(dataRow);
}
SqlParameter[] sqlParameter = { new SqlParameter("@TVP", dataTable) };
SqlHelper.ExecuteNonQuery(connectionString, CommandType.StoredProcedure, "CreatePassportWithTVP", sqlParameter);
stopwatch.Stop();
return stopwatch.ElapsedMilliseconds;
}
這種方法實現起來有點兒複雜。首先, 在資料庫裡新建一個自定義型別,繼承Table型別的,然後建立Stored Procedure,將剛建立的自定義型別作為引數傳入。關鍵點在這裡了:使用insert into ... select ... from ...這個語句來實現批量插入。最後就剩下在ADO.Net中呼叫這個儲存過程,將DataTable作為引數傳入就大功告成了。
PS. 可能有人要說,DataAdapter不是提供了一個Update的方法,可以實現批量Insert、Delete、Update 的麼?但其實DataAdapter的這種做法跟逐條逐條sql語句輸入資料庫然後執行沒什麼區別,甚至更慢。還是上面提供的這兩種方法可以從根本上提升批量插入的效能。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-663251/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用 【Ado.Net】 批量插入資料
- mybatis插入資料、批量插入資料MyBatis
- oracle批量插入資料Oracle
- MyBatis 批量插入資料MyBatis
- Mybatis批量插入Oracle、MySQLMyBatisOracleMySql
- MongoDB不支援批量插入MongoDB
- MySQL:JDBC批量插入資料的效率MySqlJDBC
- 插入大量資料速度慢的解決方法:批量插入
- .net Excel 批量插入效能慢Excel
- ibatis對oracle資料庫的批量更新和批量插入的操作BATOracle資料庫
- 【MyBatis】幾種批量插入效率的比較MyBatis
- 批量插入資料的儲存過程儲存過程
- insert批量插入優化方案優化
- 使用PrepareStatement實現批量插入操作REST
- 使用MySqlBulkLoader批量插入資料MySql
- hibernateHQl批量插入、刪除、更新
- 大表資料插入批量提交
- 海量資料處理_批量插入
- SQL語句批量插入資料SQL
- SqlBulkCopy 複製批量插入資料SQL
- 使用Mybatis批量插入大量資料的實踐MyBatis
- PHP配上MySQL實現批量更新插入PHPMySql
- MyBatis Plus 批量資料插入功能,yyds!MyBatis
- 正規表示式處理批量插入
- EF批量插入太慢?那是你的姿勢不對
- 資料庫批量插入這麼講究的麼?資料庫
- db2 sql批量插入一張表插入另一張表DB2SQL
- Oracle批量插入資料insert all into用法Oracle
- Redis從檔案中批量插入資料Redis
- MSSQL資料批量插入優化詳細SQL優化
- 向表中插入大批量資料
- 批量插入資料時主鍵衝突的處理
- 點評 ibatis+oracle 批量插入的三種方法.BATOracle
- 如何向mysql中批量插入大量sql語句MySql
- 使用SqlBulkCopy批量插入或遷移資料(轉)SQL
- Mybatis批量插入,是否能夠返回id列表MyBatis
- 後端開發:【批量插入海量資料之Java插入MySql】解決方案後端JavaMySql
- MyBatis中批量插入資料,多重forEach迴圈MyBatis