C# SQL批量复制与结构化表插入
只是想知道结构化表插入和大容量复制之间是否存在性能差异。 在我开始实施之前可能会执行的任何经验或想法。我正在使用Spring.net进行数据库层调用 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结构化类
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行时表现良好
重用的表值参数受益于临时表
缓存。此表缓存比等效缓存具有更好的可伸缩性
批量插入操作。通过使用小行插入操作
通过使用参数列表或
批处理语句,而不是批量插入操作或表值
参数。然而,这些方法编程不太方便,并且
随着行数的增加,性能会迅速降低
表值参数的性能与等效参数相同或更好
数组实现