SQL 批量复制与结构化 Table 插入

SQL Bulk copy versus Structured Table Insert

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

Sql 批量插入

using (SqlBulkCopy bulkCopy = new SqlBulkCopy(this.connectionstring)
{
 bulkCopy.DestinationTableName = "BulkDataTable";
 bulkCopy.WriteToServer(dataTable);
}

Sql 结构化类型插入 创建映射到数据table 的数据类型,并传递数据table 以及要批量插入的所有行。

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);

这实际上取决于您要批量插入多少数据以及您的 SQL 服务器实例的恢复模式是如何设置的。如果数据库处于简单恢复或批量恢复中,则 SqlBulkCopy 可以在某些情况下为您提供最少记录的插入。如果数据库完全恢复,性能可能不会有太大差异。

来自MSDN的进一步比较:

Using table-valued parameters is comparable to other ways of using set-based variables; however, using table-valued parameters frequently can be faster for large data sets. Compared to bulk operations that have a greater startup cost than table-valued parameters, table-valued parameters perform well for inserting less than 1000 rows.

Table-valued parameters that are reused benefit from temporary table caching. This table caching enables better scalability than equivalent BULK INSERT operations. By using small row-insert operations a small performance benefit might be gained by using parameter lists or batched statements instead of BULK INSERT operations or table-valued parameters. However, these methods are less convenient to program, and performance decreases quickly as rows increase.

Table-valued parameters perform equally well or better than an equivalent parameter array implementation.