簡體   English   中英

SQL批量復制與結構化表插入

[英]SQL Bulk copy versus Structured Table Insert

只是想知道結構化表插入和批量復制之間是否存在性能差異。 在開始實施之前,任何可能有效的經驗或想法。 我正在使用Spring.net進行數據庫層調用。

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

這實際上取決於您要批量插入多少數據以及如何設置SQL Server實例的恢復模式。 如果數據庫處於簡單或批量恢復狀態,則在某些情況下,SqlBulkCopy可以為您提供最少記錄的插入。 如果數據庫是完全恢復的,則性能可能不會有太大差異。

來自MSDN的進一步比較:

使用表值參數與使用基於集合的變量的其他方式具有可比性。 但是,對於大型數據集,經常使用表值參數可能會更快。 與啟動成本比表值參數大的批量操作相比,表值參數在插入少於1000行時表現良好。

重用的表值參數受益於臨時表緩存。 與等效的BULK INSERT操作相比,此表緩存可實現更好的可伸縮性。 通過使用小的行插入操作,通過使用參數列表或批處理語句而不是BULK INSERT操作或表值參數,可以獲得較小的性能優勢。 但是,這些方法不太方便編程,並且隨着行數的增加,性能會迅速下降。

表值參數的性能等同於或優於等效參數數組的實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM