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.
只是想知道结构化 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.