C# SQL批量复制与结构化表插入

C# SQL批量复制与结构化表插入,c#,sql-server,ado.net,bulkinsert,C#,Sql Server,Ado.net,Bulkinsert,只是想知道结构化表插入和大容量复制之间是否存在性能差异。 在我开始实施之前可能会执行的任何经验或想法。我正在使用Spring.net进行数据库层调用 Sql批量插入 using (SqlBulkCopy bulkCopy = new SqlBulkCopy(this.connectionstring) { bulkCopy.DestinationTableName = "BulkDataTable"; bulkCopy.WriteToServer(dataTable); } Sql结构化类

只是想知道结构化表插入和大容量复制之间是否存在性能差异。 在我开始实施之前可能会执行的任何经验或想法。我正在使用Spring.net进行数据库层调用

Sql批量插入

using (SqlBulkCopy bulkCopy = new SqlBulkCopy(this.connectionstring)
{
 bulkCopy.DestinationTableName = "BulkDataTable";
 bulkCopy.WriteToServer(dataTable);
}
Sql结构化类型插入 创建映射到datatable的数据类型,并传递数据表以及要批量插入的所有行

DataTable dataTable = this.dataTableRef.Value.Clone();
// add rows the the binary data table
SqlParameter insertParam = new SqlParameter();
insertParam.ParameterName = "DataTableInput";
insertParam.SqlDbType = SqlDbType.Structured;
insertParam.TypeName = "dbo.DataTableType";
insertParam.Value = dataTable;
insertParams.AddParameter(insertParam);
AdoTemplate.ExecuteNonQuery(CommandType.Text, "INSERT INTO <table_name> SELECT * FROM @DataTableInput", insertParams);
DataTable DataTable=this.dataTableRef.Value.Clone();
//在二进制数据表中添加行
SqlParameter insertParam=新的SqlParameter();
insertParam.ParameterName=“DataTableInput”;
insertParam.SqlDbType=SqlDbType.Structured;
insertParam.TypeName=“dbo.DataTableType”;
insertParam.Value=数据表;
insertParams.AddParameter(insertParam);
AdoTemplate.ExecuteNonQuery(CommandType.Text,“插入@DataTableInput中的SELECT*”,insertParams);

这实际上取决于要大容量插入的数据量以及SQL Server实例恢复模式的设置方式。在某些情况下,如果数据库处于简单恢复或大容量恢复中,SqlBulkCopy可以为您提供最少的日志插入。如果数据库处于完全恢复状态,则性能差异可能不大

进一步比较:

使用表值参数与使用其他参数的方法相当 基于集合的变量;但是,经常使用表值参数 对于大型数据集,速度更快。与批量操作相比 比表值参数、表值 参数在插入少于1000行时表现良好

重用的表值参数受益于临时表 缓存。此表缓存比等效缓存具有更好的可伸缩性 批量插入操作。通过使用小行插入操作 通过使用参数列表或 批处理语句,而不是批量插入操作或表值 参数。然而,这些方法编程不太方便,并且 随着行数的增加,性能会迅速降低

表值参数的性能与等效参数相同或更好 数组实现