C#優化:在數據庫中插入2億行

c# datatable sqlbulkcopy

我有以下(簡化)代碼,我想優化速度:

long inputLen = 50000000; // 50 million 
DataTable dataTable = new DataTable();
DataRow dataRow;
object[] objectRow;
while (inputLen--)
{
    objectRow[0] = ...
    objectRow[1] = ...
    objectRow[2] = ...

    // Generate output for this input
    output = ...

    for (int i = 0; i < outputLen; i++) // outputLen can range from 1 to 20,000
    {
         objectRow[3] = output[i];
         dataRow = dataTable.NewRow();
         dataRow.ItemArray = objectRow;
         dataTable.Rows.Add(dataRow);
    }
}

// Bulk copy
SqlBulkCopy bulkTask = new SqlBulkCopy(connection, SqlBulkCopyOptions.TableLock, null);
bulkTask.DestinationTableName = "newTable";
bulkTask.BatchSize = dataTable.Rows.Count;
bulkTask.WriteToServer(dataTable);
bulkTask.Close();

我已經在使用SQLBulkCopy試圖加快速度,但似乎為DataTable本身分配值證明是慢的。

我不知道DataTables是如何工作的所以我想知道我是否通過首先創建一個可重用的數組,然後將它分配給DataRow,然後將DataRow添加到DataTable來創建不必要的開銷?或者首先使用DataTable不是最佳的?輸入來自數據庫。

我不太關心LOC,只關心速度。任何人都可以就此提出一些建議嗎?

一般承認的答案

對於這麼大的桌子,你應該使用

public void WriteToServer(IDataReader reader)

方法。

這可能意味著你必須用自己的代碼實現自己的“假” IDataReader接口(如果你沒有從現有的IDataReader獲取數據),但這樣,你將IDataReader獲得“流” ,並將避免2億次循環。


熱門答案

我不建議在內存中保存一個巨大的數據表,而是建議實現一個IDataReader ,它在批量複製時提供數據。這將減少將所有內容保留在內存中的需要,因此應該有助於提高性能。



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow