2016-12-05 92 views
1

想知道结构化表格插入与大容量拷贝之间是否存在性能差异。 在我开始实施它之前,任何经验或想法都可能是高性能的。我正在使用Spring.net进行数据库层调用。SQL大容量拷贝与结构化表格插入

的Sql大容量插入

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

SQL结构类型插入件 创建映射到数据表中的数据类型,并通过使用的数据表的所有批量要被插入的行。

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

回答

2

这实际上取决于您想要批量插入多少数据以及如何设置SQL Server实例的恢复模式。如果数据库处于简单或批量恢复状态,SqlBulkCopy可以在某些情况下为您提供最低限度的日志记录插入。如果数据库完全恢复,可能没有太大的性能差异。

MSDN进一步比较:

使用表值参数是与使用 基于集合的变量的其它方式;然而,对于大型数据集,频繁使用表值参数 可能会更快。与批量操作相比, 具有比表值参数更大的启动成本,对于插入少于1000行的表值 参数性能良好。

重用的表值参数受益于临时表 缓存。此表缓存支持比等效的BULK INSERT操作更好的可扩展性。通过使用小的行插入操作,可以通过使用参数列表或 批处理语句而不是BULK INSERT操作或表值 参数来获得小的 性能优势。但是,这些方法编程不太方便,并且随着行数的增加,性能会迅速下降。

表值参数的执行效果与同等参数 阵列实现相当。