- #region 使用SqlBulkCopy
- public static bool ExecuteTransactionScopeInsert(DataTable dt, int batchSize)
- {
- int count = dt.Rows.Count;
- string tableName = "TestTable";
- int copyTimeout = 600;
- bool flag = false;
- try
- {
- using (SqlConnection cn = new SqlConnection(connectionString))
- {
- using (TransactionScope scope = new TransactionScope())
- {
- cn.Open();
- using (SqlBulkCopy sbc = new SqlBulkCopy(cn))
- {
- //服务器上目标表的名称
- sbc.DestinationTableName = tableName;
- sbc.BatchSize = batchSize;
- sbc.BulkCopyTimeout = copyTimeout;
- for (int i = 0; i < dt.Columns.Count; i++)
- {
- //列映射定义数据源中的列和目标表中的列之间的关系
- sbc.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);
- }
- sbc.WriteToServer(dt);
- flag = true;
- scope.Complete();//有效的事务
- }
- }
- }
- }
- catch (Exception ex)
- {
- LogHelper.Error(ex.Message);
- return false;
- }
- return flag;
- }
- #endregion
结果如下:
Use SqlServer TransactionScope Insert;RecordCount:40000;BatchSize:10;Time:10314;
Use SqlServer TransactionScope Insert;RecordCount:40000;BatchSize:20;Time:4476;
Use SqlServer TransactionScope Insert;RecordCount:40000;BatchSize:50;Time:2021;
Use SqlServer TransactionScope Insert;RecordCount:40000;BatchSize:100;Time:1332;
Use SqlServer TransactionScope Insert;RecordCount:40000;BatchSize:200;Time:978;
Use SqlServer TransactionScope Insert;RecordCount:40000;BatchSize:400;Time:730;
Use SqlServer TransactionScope Insert;RecordCount:40000;BatchSize:500;Time:649;
Use SqlServer TransactionScope Insert;RecordCount:40000;BatchSize:600;Time:623;
Use SqlServer TransactionScope Insert;RecordCount:40000;BatchSize:700;Time:669;
Use SqlServer TransactionScope Insert;RecordCount:40000;BatchSize:800;Time:585;
Use SqlServer TransactionScope Insert;RecordCount:40000;BatchSize:1000;Time:681;
SqlBulkCopy原理是采用了SQL Server的BCP协议进行数据的批量复制,结合使用事务,就我们的案例而言,大约每批800条是平衡点,性能比逐条插入提高了100多倍,并前面同样使用事务批量插入的案例性能提升了7倍以上。
全文链接:
.NET批量大数据插入性能分析及比较(2.普通插入与拼接sql批量插入)
.NET批量大数据插入性能分析及比较(4.使用DataAdapter批量插入)
.NET批量大数据插入性能分析及比较(5.使用SqlBulkCopy)
bcp 实用工具可以在 Microsoft SQL Server 实例和用户指定格式的数据文件间大容量复制数据。 使用 bcp 实用工具可以将大量新行导入 SQL Server 表,或将表数据导出到数据文件。 除非与 queryout 选项一起使用,否则使用该实用工具不需要了解 Transact-SQL 知识。 若要将数据导入表中,必须使用为该表创建的格式文件,或者必须了解表的结构以及对于该表中的列有效的数据类型。
Microsoft SQL Server 提供一个称为 bcp 的流行的命令提示符实用工具,用于将数据从一个表移动到另一个表(表既可以在同一个服务器上,也可以在不同服务器上)。SqlBulkCopy 类允许编写提供类似功能的托管代码解决方案。还有其他将数据加载到 SQL Server 表的方法(例如 INSERT 语句),但相比之下 SqlBulkCopy 提供明显的性能优势。
使用 SqlBulkCopy 类只能向 SQL Server 表写入数据。但是,数据源不限于 SQL Server;可以使用任何数据源,只要数据可加载到 DataTable 实例或可使用 IDataReader 实例读取数据。