2016-12-05 42 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操作或表值 參數來獲得小的 性能優勢。但是,這些方法編程不太方便,並且隨着行數的增加,性能會迅速下降。

表值參數的執行效果與同等參數 陣列實現相當。